結論
僅在 Hibernate 映射文件/註解中定義關聯關係即可,數據庫層面不強制要求建立外鍵約束。
詳細分析
- Hibernate 映射的目的:讓開發以面向對象方式操作關聯數據 (如
@OneToMany、@ManyToOne),運行時由 Hibernate 自動生成關聯查詢/級聯操作 SQL。
- 數據庫外鍵的作用:保證數據完整性 (引用完整性)、防止孤兒記錄、支持級聯刪除/更新 (ON DELETE CASCADE)。
- 兩者關係:
- 映射中定義關聯,Hibernate 運行正常,**不依賴** 數據庫外鍵存在。
- 生產環境**強烈建議**在數據庫建立外鍵,作為最後一道防線防止非法數據 (繞過應用層直接操作 DB)。
- 若映射與數據庫外鍵定義不一致 (如映射級聯刪除但 DB 無外鍵),可能導致數據不一致或異常。
最佳實踐配置
<property name="hibernate.hbm2ddl.auto">update</property>
開發期設為 update 讓 Hibernate 自動同步表結構 (含外鍵);生產期改為 validate 或由 DBA 管理腳本。
總結
- 映射層**必須**定義關聯 (否則無法導航對象圖)。
- 數據庫層**建議**建立外鍵 (保障數據質量)。
- 兩者定義應保持一致。