一對多 @JoinColumn(name=“FK_name”) 在多的一方的作用是為了指定外鍵字段的名稱,就算沒有ManyToOne也會自己創建外鍵 在一的一方是為了指定外表指向本表的外鍵,如果沒有該注解,會創建一張中間表來維系關系
以下內容裝載自[http://www.cnblogs.com/ShawnYuki/p/6363547.html](http://www.cnblogs.com/ShawnYuki/p/6363547.html)
mappedBy
我們知道,mappedBy用于指定具有雙向關系的兩個實體中。哪個實體是被關聯處理的。它有如下四個特點:
1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;
2.@OneToMany(mapped=“由One的一方指向Many的一方,并且,這個屬性應該等于Many的一方中含有One類的屬性的對象名,否則會出錯”)
3.關系的擁有方(即Many的一方)負責關系的維護,在擁有方建立外鍵。所以用到@JoinColumn
4.mappedBy跟JoinColumn/JoinTable總是處于互斥的一方
mappedBy和@JoinColumn的對比
但是,在使用@OneToMany注解的時候,為了讓One知道Many中的對象的哪個字段來關聯自己的時候,在Many的一方,我們既可以用@OneToMany的mappedBy指向一個對象變量,也可以用@JoinColumn指向One的一個外鍵字段。
例如:一個年級有多個學生,其中顯然是:年級(one)學生(many)
學生(ManyToOne):
1 //學生 2 public class Student { 3 4 @ManyToOne 5 @JoinColumn(name = “grade_id”) 6 PRivate Grade grade; 7 8 //get和set方式省略 9 } 年級(OneToMany):
mappedBy方式:
1 //年級 2 public class Grade { 3 4 @OneToMany(mappedBy = “grade”, cascade = CascadeType.ALL) 5 private Set students; 6 7 //get和set方式省略 8 } 以上Grade使用@OneToMany注解通過mappedBy指定了集合中的對象Student是通過grade屬性關聯到Grade的。 同時設置了cascade為CascadeType.ALL,當某個grade中進行操作時也會級聯對集合中student進行同樣的操作,需要注意的是必須為集合中的student設置garde屬性為當前需要操作的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關聯到當前的Grade的,當設置Cascade的時候,當對某個grade進行某種操做時也會級聯對集合中的student進行同樣的操作,同時還會對集合中新增的對象進行一次update操作,以保證集合中的對象有外鍵關鍵到當前對象,因此可以不一定要設置student指向grade。 需要注意的是,如果沒有設置級聯,但是集合中有未保存的student,對grade進行操作時,會報異常,org.springframework.dao.InvalidDataaccessApiUsageException: object references an unsaved transient instance - save the transient instance before 當進行級聯操作時,相當于發出了如下的update語句來維護many中的對象和one關系:
update t_student set grade_id=? where id=? 查閱資料對比得知,或許用mappedBy更好,因為當進行級聯操作時,不會發出更多的update語句來維護many中的對象和one關系。但還要根據實際情況加以選擇。
新聞熱點
疑難解答