hibernate關(guān)聯(lián)映射注解
1、一對一單項(xiàng)外鍵(比如實(shí)體People和實(shí)體IDCard,一個(gè)人對應(yīng)一個(gè)身份證號,反之)
@OneToOne(cascade=CAscadeType.ALL)全級聯(lián)關(guān)系
@JoinColumn(name="pid",unique=true)被控類的外鍵寫到主控類中,且唯一
ps:保存時(shí)應(yīng)該先保存外鍵對象,再保存主表對象,這是因?yàn)閿?shù)據(jù)庫相關(guān)約束的原因
2、一對一雙向外鍵
主控方配置不變
被控方添加
@OneToOne(mappedBy="card")myppedBy指定了把控制權(quán)利交給主控方,指定主控方所對應(yīng)的外鍵屬性card
ps:雙向關(guān)聯(lián),必須設(shè)置mappedBy屬性,因?yàn)殡p向關(guān)聯(lián)只能交給一方去控制,不可能雙方都設(shè)置外鍵保存關(guān)聯(lián)關(guān)系,否則雙方都無法保存
3、多對一單向外鍵(如多個(gè)學(xué)生對應(yīng)一個(gè)班級)
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
EAGER表示迫切的加載
@JoinColumn(name="cid",referencedColumnName="CID")JoinColumn在此處表示多方持有一方的引用,一方的外鍵用name表示,referencedColumnName表示如果這個(gè)外鍵映射到數(shù)據(jù)庫中作為屬性給它起的別名
4、一對多單向外鍵(如一個(gè)班級有多個(gè)學(xué)生)
在一的一方添加注解,一方持有多方的一個(gè)集合
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid")cid仍然存在于學(xué)生表中作為外鍵
ps:FetchType的抓取數(shù)據(jù)策略,如果是多對一,多的一方通常設(shè)置為EAGER,一對多,一的一方通常設(shè)置為LAZY
5、一對多(多對一)雙向外鍵
在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name="cid")
在一的一方添加注解
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid")
ps:這里的@JoinColumn可能不太好理解,但你仔細(xì)想想(假設(shè)對象為學(xué)生和班級),每個(gè)學(xué)生都可以有一個(gè)cid屬性作為他的外鍵,表示他屬于哪個(gè)班級,但不可能班級表里面有sid,因?yàn)橐粋€(gè)班級可能有多個(gè)學(xué)生,這就導(dǎo)致sid不能只有一個(gè),這將破壞外鍵的唯一性
6、多對多單向外鍵
其中一個(gè)多方持有另一個(gè)多方的集合對象(如學(xué)生持有老師的集合)
學(xué)生和老師之間的外鍵關(guān)系的維護(hù)需要通過中間表來完成
注解
@ManyToMany
@JoinTable(name="teachers_students",JoinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
Jointable注解可以生成中間表,JoinColumns和inverseJoinColumns指定了相應(yīng)的控制字段
7、多對多雙向外鍵
雙方都持有對方的集合,其中一方設(shè)置
如教師類
@ManyToMany(mappedBy="teachers")將主控方交給學(xué)生
學(xué)生類
@ManyToMany
@JoinTable(name="teachers_students",JoinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
---------------------
作者:JokerZhan
來源:CSDN
原文:https://blog.csdn.net/JokerZhan/article/details/85014806