| 策略 | 註解設定 | 資料表結構 | 優缺點 |
|---|---|---|---|
| 單表 | @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;
}
@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。