hibernate關聯映射注解及@JoinColumn的用法


1、一對一單項外鍵(比如實體People和實體IDCard,一個人對應一個身份證號,反之)
@OneToOne(cascade=CAscadeType.ALL)全級聯關系
@JoinColumn(name="pid",unique=true)被控類的外鍵寫到主控類中,且唯一
ps:保存時應該先保存外鍵對象,再保存主表對象,這是因為數據庫相關約束的原因

2、一對一雙向外鍵
主控方配置不變
被控方添加
@OneToOne(mappedBy="card")myppedBy指定了把控制權利交給主控方,指定主控方所對應的外鍵屬性card
ps:雙向關聯,必須設置mappedBy屬性,因為雙向關聯只能交給一方去控制,不可能雙方都設置外鍵保存關聯關系,否則雙方都無法保存

3、多對一單向外鍵(如多個學生對應一個班級)
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
EAGER表示迫切的加載
@JoinColumn(name="cid",referencedColumnName="CID")JoinColumn在此處表示多方持有一方的引用,一方的外鍵用name表示,referencedColumnName表示如果這個外鍵映射到數據庫中作為屬性給它起的別名

4、一對多單向外鍵(如一個班級有多個學生)
在一的一方添加注解,一方持有多方的一個集合
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid")cid仍然存在於學生表中作為外鍵
ps:FetchType的抓取數據策略,如果是多對一,多的一方通常設置為EAGER,一對多,一的一方通常設置為LAZY

5、一對多(多對一)雙向外鍵
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name="cid")
在一的一方添加注解
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid")
ps:這里的@JoinColumn可能不太好理解,但你仔細想想(假設對象為學生和班級),每個學生都可以有一個cid屬性作為他的外鍵,表示他屬於哪個班級,但不可能班級表里面有sid,因為一個班級可能有多個學生,這就導致sid不能只有一個,這將破壞外鍵的唯一性

6、多對多單向外鍵
其中一個多方持有另一個多方的集合對象(如學生持有老師的集合)
學生和老師之間的外鍵關系的維護需要通過中間表來完成
注解
@ManyToMany
@JoinTable(name="teachers_students",JoinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
Jointable注解可以生成中間表,JoinColumns和inverseJoinColumns指定了相應的控制字段

7、多對多雙向外鍵
雙方都持有對方的集合,其中一方設置
如教師類
@ManyToMany(mappedBy="teachers")將主控方交給學生
學生類
@ManyToMany
@JoinTable(name="teachers_students",JoinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
————————————————
版權聲明:本文為CSDN博主「JokerZhan」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/JokerZhan/java/article/details/85014806


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM