一對(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í)際情況加以選擇。
新聞熱點(diǎn)
疑難解答
圖片精選