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

EJB 3.0 實體 Bean 繼承映射策略:單表策略完整實作

     編輯:Java 相關知識

繼承映射三大策略

策略註解設定資料表結構優缺點
單表@Inheritance(SINGLE_TABLE) + @DiscriminatorColumn單表含所有欄位 + 判別欄查詢快、空間浪費(NULL 多)
連接表@Inheritance(JOINED) + @DiscriminatorColumn父表 + 子表各自欄位,主鍵關聯正規化好、查詢需 JOIN
每類一表@Inheritance(TABLE_PER_CLASS)每個具體類一張獨立表多型查詢需 UNION、效能差

單表策略實作範例


@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE, discriminatorType = DiscriminatorType.STRING)
@DiscriminatorColumn(name = "P_TYPE", length = 10)
public class Person implements Serializable {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name, gender;
    // getter/setter
}

@Entity
@DiscriminatorValue("Man")
public class Man extends Person {
    private boolean isGood;
}

@Entity
@DiscriminatorValue("Woman")
public class Woman extends Person {
    private boolean isBeautiful;
}

Session Bean 操作


@Stateless
public class PersonDAOBean implements PersonDAO {
    @PersistenceContext EntityManager em;

    public int createMan(String name, String gender, boolean good) {
        Man m = new Man(); m.setName(name); m.setGender(gender); m.setGood(good);
        em.persist(m); return m.getId();
    }
    // 查詢父類型自動包含子類
    public List findByGender(String gender) {
        return em.createQuery("FROM Person p WHERE p.gender = :g")
                 .setParameter("g", gender).getResultList();
    }
}

資料庫驗證

單一 PERSON 表包含 ID, NAME, GENDER, P_TYPE, IS_GOOD, IS_BEAUTIFUL 欄位,P_TYPE 值為 "Man"/"Woman"/NULL。

選擇建議

  • 繼承層級淺、子類欄位少、頻繁多型查詢 → 單表策略
  • 子類欄位多、強調正規化、單類查詢為主 → 連接表策略
  • 極少多型查詢、子類獨立演進 → 每類一表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved