Hibernate一對多和多對一關係詳解

2021-07-09 02:43:12 字數 2658 閱讀 2012

雙向一對多關係,一是關係維護端(

owner side

),多是關係被維護端(

inverse side

)。在關係被維護端需要通過@joincolumn建立外來鍵列指向關係維護端的主鍵列

public

classorderimplementsserializable }

public

classorderitem

implementsserializable }

@orderby(value = "id asc") 

指明載入

orderitem 

時按id 

的公升序排序

@onetomany的屬性

1>targetentity

定義關係類的型別,預設是該成員屬性對應的類型別,所以通常不需要提供定義。

定義類之間的雙向關係。如果類之間是單向關係,不需要提供定義,如果類和類之間形成雙向關係,我們就需要使用這個屬性進行定義,否則可能引起資料一致性的問題。

該屬性的值是「多」方

class

裡的「一」方的變數名

3>cascade

該屬性定義類和類之間的級聯關係。定義的級聯關係將被容器視為對當前類物件及其關聯類物件採取相同的操作,而且這種關係是遞迴呼叫的。舉個例子:

order 

和orderitem

有級聯關係,那麼刪除

order

時將同時刪除它所對應的

orderitem

物件。而如果

orderitem

還和其他的物件之間有級聯關係,那麼這樣的操作會一直遞迴執行下去。

cascade

的值只能從

cascadetype.persist

(級聯新建)、

cascadetype.remove

(級聯刪除)、

cascadetype.refresh

(級聯重新整理)、

cascadetype.merge

(級聯更新)中選擇乙個或多個。還有乙個選擇是使用

cascadetype.all

,表示選擇全部四項。

4>fatch

可選擇項包括:

fetchtype.eager

和fetchtype.lazy

。前者表示關係類

(本例是

orderitem 類)

在主類(

本例是order類)

載入的時候同時載入,後者表示關係類在被訪問時才載入。預設值是

fetchtype.lazy。

@joincolumn(name = "order_id")

注釋指定orderitem對映表的order_id列作為外來鍵與order 對映表的主鍵列關聯。

@manytoone

:指明orderitem和order之間為多對一關係。

@manytoone

注釋有四個屬性:targetentity

、cascade、fetch 和optional,前三個屬性的具體含義和@onetomany的同名屬性相同,但@manytoone

的fetch 屬性預設值是fetchtype.eager。

optional屬性是定義該關聯類是否必須存在,值為false 時,關聯類雙方都必須存在,如果關係被維護端不存在,查詢的結果為null。值為true 時, 關係被維護端可以不存在,查詢的結果仍然會返回關係維護端,在關係維護端中指向關係被維護端的屬性為null。optional

屬性的預設值是true。optional 

屬性實際上指定關聯類與被關聯類的join 查詢關係,如optional=false 

時join 查詢關係為inner join, optional=true 時join 查詢關係為left join。下面**片斷解釋如下:

有一點需要強調:當業務方法需要把乙個實體

bean

作為引數返回給客戶端時,除了實體

bean

本身需要實現

serializable 

介面之外,如果關聯類

(orderitem)

是延遲載入,還需在返回實體

bean

之前通過訪問關聯類的方式載入關聯類(見下例)。否則在客戶端訪問關聯類時將會丟擲載入例外。

publicorder getorderbyid(integer orderid)

另外不管是否延遲載入,通過

join fetch 

關聯語句都可顯式載入關聯類,如下例:

publiclist getallorder()

hibernate單向一對多和雙向一對多

單向一對多 例如有部門封裝類 private int deptno private string deptname private string location 有職員封裝類 private int empno private string empname private dept dept 在多...

hibernate 的多對多的關聯和一對多的關聯

資料庫的多對多 1.1 資料庫中不能直接對映多對多 處理 建立乙個橋接表 中間表 將乙個多對多關係轉換成兩個一對多 注1 資料庫多表聯接查詢 永遠就是二個表的聯接查詢 a b c d t1 c t2 d t3a b ab select from a,b,ab where a.aid ab.aid a...

Django ORM 一對多 和 多對多

在 models.py 上定義 class province models.model name models.charfield max length 32 def str self return self.name class city models.model name models.char...