hibernate对象关系实现(二)一对一
雙向一對一以部門和經理為例:
a.部門和經理類中各自由對方的引用:(省略了get/set方法)
b.數據庫兩種方式實現:一種(b.1)是外鍵映射,并將外鍵添加唯一約束(至于哪個對象的主鍵做外鍵,可隨意,差別是在獲取關聯對象數據的方式上有些差異);第二種(b.2)方式是:主鍵映射即把外鍵作為主鍵。例子如下:
? b.1:部門表的外鍵屬于經理表的主鍵;外鍵manargerz_id設置唯一約束
? ?b.2:主鍵映射:部門表的主鍵屬于經理表的主鍵;(外鍵做主鍵)
?
c:映射配置也對應分兩種,c.1外鍵映射配置和c.2主鍵映射配置
? ?c.1配置外鍵映射:
? ? ? ?部門類映射配置:配置的不同外鍵所屬的表業不同:以部門表添加經理Id為外鍵:
? ? 以many-to-one 配置外鍵所屬的表:即當前類所對應的表中添加外鍵;
? ? colunm:外鍵的名稱;
? ? unique=true:表示外鍵唯一,即實現一對一關系
?
? ?經理類映射配置:
? ? 注意:property-ref=mgr 表示:部門類mgr屬性對應的mgr_id列;在獲取經理對象時,會采用左連接的方式查詢出部門數據;連接的條件由該屬性指明;如果沒有該屬性默認 ? ? ? ? ? ? ?連接的是部門表主鍵而非外鍵;
?
c.2主鍵映射的方式:
? ? ?部門對象映射配置:將部門表中屬于經理表主鍵的外鍵作為主鍵為例:
上一個紅框只是主鍵值獲取的方式被確定;后一個指定約束,即對應的主表的主鍵不能隨意修改的刪除
?
經理映射配置如下:去掉指定的關聯字段。
?
? ? hibernate.cfg.xml(下):
d:測試(省略了session的獲取提交和關閉)
d.1外鍵關聯的測試:
? ?保存:注意先后順序;順序不同實際執行的步驟不同;
? ?獲取:部門關聯的對象會延遲加載;
? ? ? ? 通過dept獲取經理對象并使時,在獲取的時候會通過左連接的方式查詢出經理對象;連接條件是經理映射配置中指定列;
(有點奇怪)(在獲取經理對象時,經理對象內的引用部門的對象數據難道是查詢出來的,而不是從session獲取的? 難道這兩個部門對象不是同一個對象,還是說,只是把數據檢查更新了一遍;或者說獲取某個對象時候,只會單向的從所對應的映射配置中查看是否有關聯的字段,而不會去從關聯的對象,查看關聯對象的映射情況,這樣的話,那兩個部門對象就不是同一個對象了;這樣會出現更多的問題,只能是同一個對象才不會一直重復去獲取數據了,難道是獲取數據后再從session中緩存中比較查找,而不是先從session查找?
?
? ?直接獲取經理對象采用左連接查詢出經理對象同時查詢出部門的數據(這個和一對多不一樣啊:說hibernate不能知道關聯,因為經理表沒有外鍵,這個解釋有點不通)
?
c.2主鍵關聯的測試:
保存:(和外鍵關聯不同)
? ? ? ?順序不同執行過程是一樣的,因為部門記錄插入,總要等到經理數據插入,以便獲取到自己的主鍵值。
獲取:(和外鍵關聯差不多)
? ? ? ? ?獲取部門對象關聯經理對象會采用延長加載的方式;通過部門對象獲取的經理對象在使用時會,通過連接查詢的方式獲取;
? ? ? ? ?獲取經理數據時,會用一條連接語句同時獲取部門數據
?
轉載于:https://www.cnblogs.com/straybirds/p/5152438.html
總結
以上是生活随笔為你收集整理的hibernate对象关系实现(二)一对一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostCss 从0开始
- 下一篇: BZOJ 3669: [Noi2014]