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

EJB 3.0 簡化企業級 Java 開發(二):註解驅動的 POJO 持久化與對象關係映射

     編輯:Java 相關知識

系列脈絡

  • 第一部分:註解開發 POJO 服務(依賴注入、容器服務組合)
  • 第二部分:實體 Bean 簡化持久化與 ORM(本文)

商業邏輯背後,多數應用依賴高效能關係型資料庫支撐資料模型層。

ORM 挑戰與兩條路徑

手動 JDBC

直接操作 SQL,手動在物件模型與 JDBC 結果集轉換。適合內部模型接近二維表的簡單應用。

自動 ORM 框架

提供物件導向 API 存儲/查詢/檢索,框架自動完成物件↔關係表轉換。定義專屬查詢語言(如 HQL),自動生成特定資料庫 SQL。適合複雜資料模型,節省時間、降低錯誤。

物件資料庫 vs ORM

物件資料庫直接存儲物件,無需 ORM,但成熟度、效能遜於關係型資料庫。優秀 ORM 框架本質上為關係型資料庫提供物件資料庫介面。

主流 ORM 框架演進

  • EJB 1.x/2.x 實體 Bean:官方方案但設計拙劣——嚴格元件模型(Home/Remote 介面、抽象類繼承、大量空方法)、冗長易錯 XML 映射檔,難以構建面向物件資料模型。
  • Hibernate (JBoss) & TopLink (Oracle):最成功的 POJO ORM 框架。無預定義元件模型,使用 JavaBean 風格 POJO,自動推導映射與關係。XML 配置類別↔資料表、屬性↔欄位。透過 Session 等工具操作 POJO。

EJB 3.0 兩大關鍵創新

  1. 註解取代 XML:映射資訊直接標註在 POJO 程式碼中(如欄位對應、關係定義),更直觀、易維護。
  2. 持久化單元封裝格式:每個封裝檔擁有獨立配置集,定義持久化上下文,針對後端資料庫與 ORM 行為專用化。

簡單物件映射範例

@Entity
// @Table(name="AlternativeTableName")
public class Person implements Serializable {
    protected int id;
    protected String name;
    protected Date dateOfBirth;

    public void setId(int id) { this.id = id; }
    @Id(generate = GeneratorType.AUTO)
    public int getId() { return id; }

    public void setName(String name) { this.name = name; }
    // @Column(name="AlternativeColumnName")
    public String getName() { return name; }

    public void setDateOfBirth(Date dob) { this.dateOfBirth = dob; }
    public Date getDateOfBirth() { return dateOfBirth; }
}
  • @Entity:標記為持久化實體
  • 預設表名 = 類名,@Table 可覆寫
  • 預設欄位名 = 屬性名,@Column 可覆寫
  • @Id + GeneratorType.AUTO:主鍵自動生成

物件關係映射:三大核心關係

@Entity
public class Person implements Serializable {
    // ...
    protected Resume resume;           // 一對一
    protected CreditCard[] cards;      // 一對多
    protected Address addr;            // 多對一

    @OneToOne
    public Resume getResume() { return resume; }

    @ManyToOne
    // @JoinColumn(name="MyCustomId")
    public Address getAddr() { return addr; }

    @OneToMany
    public Collection getCards() { return cards; }
}

關係實現機制

  • 一對一:Person 表含 Resume 表主鍵外鍵,容器保證唯一性。雙向查詢需在 Resume 端也定義 Person 屬性並加 @OneToOne。
  • 多對一:Person 表含 Address 表主鍵外鍵,相同 Address 鍵值可出現在多筆 Person 記錄。
  • 一對多:外鍵定義在「多」的一方。CreditCard 類必須定義 @ManyToOne Person 屬性。

外鍵欄位名自訂

外鍵欄位名由容器自動決定,或透過 @JoinColumn 顯式指定。

繼承映射(下一節重點)

面向物件設計核心概念,EJB 3.0 提供多種繼承映射策略(單表、聯表、具體表各自為表),平衡儲存效率與查詢複雜度。

總結

EJB 3.0 實體 Bean 以POJO + 註解徹底簡化 ORM:無介面/抽象類負擔、映射資訊與程式碼共存、關係定義直觀宣告、持久化上下文封裝部署單元。建立在 Hibernate/TopLink 成功經驗上,提供標準化的企業級 POJO ORM 解決方案。

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