首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Eclipse + WebSphere 7 + DB2 實作 EJB 3.0 實體 Bean 完整教學

     編輯:Java 相關知識

架構概覽

  • IDE:Eclipse IDE for Java EE Developers
  • 應用伺服器:IBM WebSphere Application Server 7 (內建 EJB 3.0 / JPA 支援)
  • 資料庫:IBM DB2 9.5 (SAMPLE 資料庫)
  • 持久化規格:JPA 1.0 (基於 Hibernate/TopLink/OpenJPA),`persistence.xml` + 註解配置。

環境建置與資料源配置

  1. 安裝 WAS 7、DB2 9.5、Eclipse,建立 SAMPLE 資料庫實例。
  2. WAS 管理主控台 → Resources → JDBC → JDBC Providers → New:
    Database: DB2, Provider: DB2 Universal JDBC Driver Provider, Implementation: Connection pool datasource。
  3. Security → Global Security → J2C Authentication Data → New:建立 DB2 登入別名 (user/password)。
  4. JDBC Provider → Data Sources → New:JNDI 名稱 `jdbc/DB2DS`,Driver Type 4, Database SAMPLE, Server localhost, Port 50000,關聯上述 J2C 別名。
    測試連線成功。

建立 EJB 3.0 專案

  1. Eclipse:File → New → EJB Project,名稱 `EJB3EntityBean`,EJB Module Version 3.0,Source Folder `ejbModule`。
  2. 加入 JRE System Library [jre6] + WAS 7 `j2ee.jar` 至 Build Path (建立 User Library `EJB3`)。
  3. Source Folder 加入 `ejbModule`。

實體 Bean 開發

1. 實體類別 (Catalog.java)


@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...
}
  • 實作 `Serializable` 利於二級快取/集群序列化。
  • `@Id` 標示主鍵,`@Table` 指定表名 (不指定預設類名)。

2. persistence.xml (META-INF/)




  
    jdbc/DB2DS
    
      
    
  

⚠️ WAS 7 不支援 `xsi:schemaLocation` 屬性,會導致部署錯誤,請移除。

會話 Bean 封裝業務邏輯

介面


@Local public interface CatalogTestLocal { String test(); }
@Remote public interface CatalogTestRemote { String test(); }

實作 (CatalogTestBean.java)


@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;
    }
}

JSP 測試客戶端


<%@ page import="com.ejb3.websphere.*, javax.naming.*" %>
<%
    InitialContext ctx = new InitialContext();
    CatalogTestLocal bean = (CatalogTestLocal) ctx.lookup(CatalogTestBean.LocalJNDIName);
    String result = bean.test();
%>
<%= result %>

Ant 建置腳本自動化

`build.xml` 目標鏈:`prepare → compile → jar → war → assemble-app → deploy`

  • `jar`:打包 `ejbModule` 下編譯類別 + `META-INF/persistence.xml` → `ejb3.jar`
  • `war`:打包 `webModule` (JSP + `WEB-INF/web.xml`) → `websphere.war`
  • `assemble-app`:打包 `META-INF/application.xml` + jar/war → `ejb3.ear`
  • `deploy`:複製 EAR 至 WAS `installableApps` 目錄 (熱部署)。


  
    
    
  

WAS 7 部署步驟

  1. 管理主控台 → Applications → New Enterprise Application → 選擇 `ejb3.ear` → Detailed 安裝。
  2. 勾選 Precompile JSP、Deploy EJB,指定安裝目錄。
  3. EJB 部署選項:Database 9.5, JDK Level 6.0, JDBC Access。
  4. JNDI 綁定:為所有介面指定 Target Resource JNDI `jdbc/DB2DS`。
  5. Virtual Host 綁定 `default_host`,Context Root `websphere`。
  6. Finish → Save → Start 應用程式。

驗證與常見問題

  • 瀏覽 `https://localhost:9080/websphere/EJB3Client.jsp` 應顯示查詢/刪除結果。
  • Session 關閉後存取 Lazy 欄位:實體若在 Session 關閉後才存取關聯/基本型別,會拋 `LazyInitializationException`。對策:在 `@Transactional` 方法內完成所有存取,或用 `em.find()` / `Hibernate.initialize()` 強制載入。
  • MyEclipse 產生 DAO 用 get():避免上層在無 Session 時存取代理物件。手動改 `load()` 時需確認 Session 生命週期。
  • Schema 驗證錯誤:`persistence.xml` 移除 `xsi:schemaLocation`。

結語

EJB 3.0 以註解取代繁瑣 XML,配合 JPA 標準化持久化,在 WAS 7 + DB2 + Eclipse 環境下可快速建立企業級資料存取層。掌握資料源配置、實體/會話 Bean 分層、JPA 註解、`persistence.xml` 細節與 Ant 自動化部署,即可高效交付健壯的 EJB 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved