天天看點

hibernate 一對多 一對一 ,多方與一方增删改查測試結果

——-------------------------------------------------------------------

  關于orcal表結構的外鍵的onDelete設定,如果這裡配置了級聯,在資料庫中 主表删除資料,從表也一塊删除,但從表删除主表不變。但這裡配置了,實體沒配置級聯,程式還沒法完成級聯操作。程式配置了級聯,這裡不管設定成啥,都可級聯删除。

一對一或者一對多,主表的實體關聯屬性的作用:1.互相包含,和從表一同儲存。2.查詢時候封裝拿到從表的值。不能單方面set從表()儲存。

一對一或者一對多,從表的實體關聯屬性的作用:1.互相包含,和主表一同儲存。2.查詢時候封裝拿到主表的值。能單方面set主表()儲存。

級聯的作用:1.隻有在互相包含一起儲存的時候,勝率一方最後的儲存步驟,沒有級聯大不了都儲存呗。2.删除的時候,能同時删除關聯的對方資料

1.一對一 外鍵  雙向 一方級聯

表結構:

B外鍵指向A主鍵

實體結構:

A B主鍵各自使用UUID自動生成

A放棄外鍵維護,配置級聯

B方無級聯配置

----------------------------------------------------------------------------

測試一方A儲存:

A放棄外鍵維護,不管是否配置級聯,A.setb 儲存報錯

A放棄外鍵維護,不管是否配置級聯,A單獨儲存成功

@OneToOne(cascade=CascadeType.ALL),A.setb 儲存報錯,互相包含儲存出錯,A單獨儲存出錯

@OneToOne A單獨儲存報錯,A.setb報錯, 互相包含報錯

結論:一對一雙向關聯,A方為主表,首先A實體必須放棄外鍵維護權,不然怎麼儲存A,删除A,查詢A都會報錯。放棄了外鍵以後,就可以單獨操作A表了 隻能單獨儲存A(setb為null),但如果想同時儲存B,就要互相包含,不同的是配置級聯,最後隻用saveA,沒配置級聯,saveA 再saveB

------------------------------------------------------------------------

測試一方删除:

@OneToOne 不放棄外鍵維護

儲存 查詢 沒有建立關聯的資料,根據id删除, 全報錯

@OneToOne(mappedBy="a") 放棄外鍵維護 沒級聯

沒有建立關聯的資料,根據id删除成功

建立關系的資料,根據id删除失敗(資料庫外鍵設定的不能為空)

建立關系的資料,根據id删除失敗(資料庫外鍵設定的能為空,且外鍵的on delete 設定為set null)

@OneToOne(mappedBy="a",cascade=CascadeType.ALL) 放棄外鍵  配置及聯

建立關系的資料,根據id删除成功,從表資料也一塊删除

沒有建立關聯的資料,根據id删除成功

    結論:雙向關聯,一方首先放棄外鍵維護權,不然啥也幹不了。放棄後,隻能删除沒建立關系的資料,配置級聯後,就可以删除那些建立關系的資料了

----------------------------------------------------------------------------------------

測試一方查詢:

隻要放棄外鍵,就可以産尋,可以查到沒關聯的資料(實體b屬性為空),也可以查到關聯資料(實體b屬性也封裝好了)

------------------------------------------------------------------------------------

多方的操作,和一方什麼配置沒關系

測試多方儲存

如果外鍵字段可為空,就可單獨儲存B(seta為null), 如果要setA(),不管是new的還是查的,a的id一定是A表中已經存在的,這樣B.seta才能儲存成功。如果想雙向同時儲存,那就互相包含。先儲存A,再儲存B,B方配置級聯,最後隻儲存B即可

測試多方查詢

根據id查詢,自動給B中封裝a屬性的值,如果是單獨資料,a就為null

測試多方删除

根據id删除,這個就是單表删除,如果配置級聯,才會和主表一塊删除

--------------------------------------------------------------------------

一對一外鍵單向關聯:

1.一般讓從表的實體保留關聯屬性,這樣主表就是單表操作,從表實體可以利用關聯屬性,set主表()儲存,利用關聯屬性查詢封裝主表值,但因為主表實體沒有關聯屬性,不能通過實體操作完成互相包含一同儲存。

從表實體保留關聯屬性:

主表正常單表查詢,别考慮放棄外鍵什麼的

主表正常單表儲存

主表id删除,單獨項正常删除,關聯項不能删除(除非外鍵可為空,且Ondelete 為set null)

從表正常單表删除

叢表正常查詢,封裝A資料

儲存就要seta的id了

如果主表方實體保留關聯屬性,主表不能set從表()儲存,這是也不能互相包含一同儲存。從表應為沒有屬性,沒法set主表()儲存,他們成了兩張單獨的表,失去實際意義。

一對一主鍵雙向關聯