實體 Bean 即 POJO,用 @Entity 標記,映射資料表。常用註解:
@Table(name="xxx") 指定表名@Id + @GeneratedValue 主鍵生成策略@Column(name="xxx") 欄位映射@Temporal 日期時間型別@OneToOne/@ManyToOne/@OneToMany/@ManyToMany 關聯@Inheritance/@DiscriminatorColumn 繼承映射
@Entity
@Table(name="orm_oto_users")
public class User implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="user_id_seq")
@Column(name="user_id")
private Long id;
@Column(name="FIRST_NAME") private String firstName;
@Column(name="LAST_NAME") private String lastName;
private String email;
private String password;
@Temporal(TemporalType.DATE) private Date created;
@OneToOne(mappedBy="user", cascade=CascadeType.ALL) private Address address;
// getter/setter 省略
}
mappedBy 指定關聯擁有方,雙向需兩邊都配置。@JoinColumn 自訂外鍵欄位名。@OneToMany 建議用 List 或 Set,避免 Bag 效能問題。| 策略 | 註解 | 特點 |
|---|---|---|
| 單表 | @Inheritance(SINGLE_TABLE) + @DiscriminatorColumn | 預設,查詢快、空值多、DDL 簡單 |
| 連接表 | @Inheritance(JOINED) | 正規化、查詢需 JOIN、寫入較慢 |
| 各表 | @Inheritance(TABLE_PER_CLASS) | 多態查詢需 UNION、主鍵跨表唯一 |
// 子類範例:單表策略
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="person_type")
@DiscriminatorValue("C")
public class Consultant extends Person {
private double rate;
// getter/setter
}
META-INF/persistence.xml 定義 persistence-unit、資料源、Hibernate 方言、二級快取等。@PersistenceContext(unitName="pu") EntityManager em; 注入。persist()、find()、merge()、remove()、createQuery() (JPQL)。merge() 重新納管。