@Entity
@Table(name="CATALOG")
public class Catalog implements Serializable {
private static final long serialVersionUID = 7422574264557894633L;
@Id
private long id;
private String journal, publisher, date, title, author;
// 無參建構子、全參建構子、getter/setter...
}
jdbc/DB2DS
⚠️ WAS 7 不支援 `xsi:schemaLocation` 屬性,會導致部署錯誤,請移除。
@Local public interface CatalogTestLocal { String test(); }
@Remote public interface CatalogTestRemote { String test(); }
@Stateless
public class CatalogTestBean implements CatalogTestLocal, CatalogTestRemote {
@PersistenceContext EntityManager em;
public static final String LocalJNDIName = "ejblocal:" + CatalogTestBean.class.getSimpleName();
public String test() {
// 建立並持久化 3 筆資料
em.persist(new Catalog(1, "IBM developerWorks", "IBM", "July 2006", "The Java XPath API", "Elliotte Rusty Harold"));
em.persist(new Catalog(2, "IBM developerWorks", "IBM", "March 2009", "Use XQuery for the presentation layer", "Brian M. Carey"));
em.persist(new Catalog(3, "IBM developerWorks", "IBM", "April 2008", "Use XQuery from a Java environment", "Brett McLaughlin"));
// 查詢特定作者
List list = em.createQuery("SELECT c FROM Catalog c WHERE c.author = :name")
.setParameter("name", "Elliotte Rusty Harold")
.getResultList();
// 列出所有標題
List all = em.createQuery("SELECT c FROM Catalog c").getResultList();
// 刪除一筆
em.remove(em.find(Catalog.class, 2L));
// 再次列出
List after = em.createQuery("SELECT c FROM Catalog c").getResultList();
// 組裝 HTML 回傳...
return htmlString;
}
}
<%@ page import="com.ejb3.websphere.*, javax.naming.*" %>
<%
InitialContext ctx = new InitialContext();
CatalogTestLocal bean = (CatalogTestLocal) ctx.lookup(CatalogTestBean.LocalJNDIName);
String result = bean.test();
%>
<%= result %>
`build.xml` 目標鏈:`prepare → compile → jar → war → assemble-app → deploy`
EJB 3.0 以註解取代繁瑣 XML,配合 JPA 標準化持久化,在 WAS 7 + DB2 + Eclipse 環境下可快速建立企業級資料存取層。掌握資料源配置、實體/會話 Bean 分層、JPA 註解、`persistence.xml` 細節與 Ant 自動化部署,即可高效交付健壯的 EJB 應用。