国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Hibernate中,mappedBy和注解@JoinColumn的對(duì)比

2024-07-21 02:52:44
字體:
供稿:網(wǎng)友

一對(duì)多 @JoinColumn(name=“FK_name”) 在多的一方的作用是為了指定外鍵字段的名稱,就算沒有ManyToOne也會(huì)自己創(chuàng)建外鍵 在一的一方是為了指定外表指向本表的外鍵,如果沒有該注解,會(huì)創(chuàng)建一張中間表來維系關(guān)系

以下內(nèi)容裝載自[http://www.cnblogs.com/ShawnYuki/p/6363547.html](http://www.cnblogs.com/ShawnYuki/p/6363547.html) mappedBy

我們知道,mappedBy用于指定具有雙向關(guān)系的兩個(gè)實(shí)體中。哪個(gè)實(shí)體是被關(guān)聯(lián)處理的。它有如下四個(gè)特點(diǎn):

1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;

2.@OneToMany(mapped=“由One的一方指向Many的一方,并且,這個(gè)屬性應(yīng)該等于Many的一方中含有One類的屬性的對(duì)象名,否則會(huì)出錯(cuò)”)

3.關(guān)系的擁有方(即Many的一方)負(fù)責(zé)關(guān)系的維護(hù),在擁有方建立外鍵。所以用到@JoinColumn

4.mappedBy跟JoinColumn/JoinTable總是處于互斥的一方

mappedBy和@JoinColumn的對(duì)比

但是,在使用@OneToMany注解的時(shí)候,為了讓One知道Many中的對(duì)象的哪個(gè)字段來關(guān)聯(lián)自己的時(shí)候,在Many的一方,我們既可以用@OneToMany的mappedBy指向一個(gè)對(duì)象變量,也可以用@JoinColumn指向One的一個(gè)外鍵字段。

例如:一個(gè)年級(jí)有多個(gè)學(xué)生,其中顯然是:年級(jí)(one)學(xué)生(many)

學(xué)生(ManyToOne):

1 //學(xué)生 2 public class Student { 3 4 @ManyToOne 5 @JoinColumn(name = “grade_id”) 6 PRivate Grade grade; 7 8 //get和set方式省略 9 } 年級(jí)(OneToMany):

mappedBy方式:

1 //年級(jí) 2 public class Grade { 3 4 @OneToMany(mappedBy = “grade”, cascade = CascadeType.ALL) 5 private Set students; 6 7   //get和set方式省略 8 } 以上Grade使用@OneToMany注解通過mappedBy指定了集合中的對(duì)象Student是通過grade屬性關(guān)聯(lián)到Grade的。 同時(shí)設(shè)置了cascade為CascadeType.ALL,當(dāng)某個(gè)grade中進(jìn)行操作時(shí)也會(huì)級(jí)聯(lián)對(duì)集合中student進(jìn)行同樣的操作,需要注意的是必須為集合中的student設(shè)置garde屬性為當(dāng)前需要操作的grade,否則新增的student的外鍵為空。

@JoinColumn方式:

1 public class Grade { 2 3 @OneToMany(cascade = CascadeType.ALL) 4 @JoinColumn(name = “grade_id”) 5 private Set students; 6 7 //get和set方式省略 8 } 以上Grade是通過聲明@JoinColumn指定了集合中的Student通過外鍵grade_id關(guān)聯(lián)到當(dāng)前的Grade的,當(dāng)設(shè)置Cascade的時(shí)候,當(dāng)對(duì)某個(gè)grade進(jìn)行某種操做時(shí)也會(huì)級(jí)聯(lián)對(duì)集合中的student進(jìn)行同樣的操作,同時(shí)還會(huì)對(duì)集合中新增的對(duì)象進(jìn)行一次update操作,以保證集合中的對(duì)象有外鍵關(guān)鍵到當(dāng)前對(duì)象,因此可以不一定要設(shè)置student指向grade。 需要注意的是,如果沒有設(shè)置級(jí)聯(lián),但是集合中有未保存的student,對(duì)grade進(jìn)行操作時(shí),會(huì)報(bào)異常,org.springframework.dao.InvalidDataaccessApiUsageException: object references an unsaved transient instance - save the transient instance before 當(dāng)進(jìn)行級(jí)聯(lián)操作時(shí),相當(dāng)于發(fā)出了如下的update語句來維護(hù)many中的對(duì)象和one關(guān)系:

update t_student set grade_id=? where id=? 查閱資料對(duì)比得知,或許用mappedBy更好,因?yàn)楫?dāng)進(jìn)行級(jí)聯(lián)操作時(shí),不會(huì)發(fā)出更多的update語句來維護(hù)many中的對(duì)象和one關(guān)系。但還要根據(jù)實(shí)際情況加以選擇。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝坻区| 银川市| 临朐县| 定安县| 老河口市| 绍兴县| 金山区| 永安市| 克拉玛依市| 沂南县| 当涂县| 公安县| 南溪县| 仙游县| 崇明县| 肇东市| 贵州省| 南昌县| 鄂温| 德兴市| 靖远县| 曲阜市| 本溪| 宣化县| 青田县| 株洲县| 壤塘县| 图木舒克市| 浮山县| 漳平市| 德阳市| 兴山县| 五台县| 手游| 阳新县| 孝义市| 黎城县| 平潭县| 文安县| 喀喇沁旗| 中山市|