必須映射。資料庫外鍵只保證數據完整性,Hibernate 需要實體類映射才能導航關聯、級聯操作、延遲加載等 ORM 功能。
@Entity
@Table(name = "orders")
public class Order {
@Id @GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "fk_order_user"))
private User user; // 多對一:訂單屬於用戶
}
// 反向導航(可選)
@Entity
@Table(name = "users")
public class User {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Order> orders = new ArrayList<>(); // 一對多:用戶擁有訂單
}
| 註解 | 作用 |
|---|---|
@ManyToOne | 多對一關聯,預設急加載,建議 fetch=LAZY |
@JoinColumn | 指定外鍵列名,foreignKey 對應 DB 约束名 |
@OneToMany(mappedBy=...) | 一對多反向端,不維護外鍵,由關係擁有方維護 |
cascade | 級聯操作:PERSIST/MERGE/REMOVE/ALL |
orphanRemoval | 從集合移除實體時自動刪除(父子強關聯) |
user.getOrders().add(order); order.setUser(user); 兩邊都要 set@EntityGraph 或 DTO 投影查詢@JoinColumn 重複定義:雙向關聯僅在擁有方(含外鍵的一方)定義DB 外鍵 ≠ ORM 映射。實體類必須聲明 @ManyToOne/@OneToMany 等註解,Hibernate 才能提供物件導航、級聯持久化、JPQL 關聯查詢等核心能力。手寫實體時務必注意雙向同步與加載策略,避免 N+1 與懶加載異常。