天天看點

hibernate基礎(八):一對多單雙向關聯(外鍵,cascade,inverse)

 1.外鍵:

           一張主表對應子表的時候,需要将自己的主鍵告訴子表,子表将主表的主鍵存在自己的表裡,通過這個字段來維持和主表的關系。子表中的這個字段就是它的外鍵

2.級聯(cascade):

           hibernate中,因為主子表通過外鍵産生了關系,很多時候,我們對主表做出修改的時候,子表其實也需要跟着變。但是每次都人為的去改變子表其實很麻煩,因為這種情況太常見而且可能子表數量也很多。是以hibernate給我們一個叫級聯的方法,當我們變更主表的時候自動的幫我們變更子表,很友善省事有沒有?

3.inverse:

           因為主表中的主鍵和子表中的外鍵其實都是指向的是同一個東西,是以也就是說,主表子表對這個東西其實都是可以進行修改的,是以我們程式員可以根據自己的使用場景規定,主表和子表到底誰可以去修改這個主鍵

4.如何使用

           以class和student來說,class是一,student是多;

           在class.hbm.xml中添加:

<set name="students">
    <key><column name="cid"></column></key>
    <one-to-many class="domain.student" cascade="save-update" inverse="false">
</set>
           

           注:

                      (1).cascade裡面的值可以有三種:save-update,delete,all。

                                 分别用于儲存更新、删除、增删改

                      (2).對于hibernate裡的更新,這不是這一章節的知識點,但是需要提一下:

                                 更新指令發出,會先對應快照區,如果一樣,不更新。如果不一樣,檢視資料庫有沒有:沒有的話,插入;有的話,更新

                      (3).inverse中,false和default表示維護外鍵的一方,true表示不維護外鍵的一方。這個容易搞反!

                                 事實上,主子表都可維護。但很明顯,對于外鍵我們讓學生那一端來維護效率要高得多

           對應java端的代碼(省去擷取session前的一系列代碼,具體可看我hibernate分類下的前幾篇文章):

Student student = new Student();
student.setSname("aaa");
session.save(student);//将學生的資料儲存在資料庫中
Classes classes = (Classes)session.get(Classes.class,1L);//擷取id為1的class
classes.getStudents().add(student);//添加學生,因為inverse維護了,是以學生中的外鍵也會修改
           

繼續閱讀