ManyToOne 雙向一對多關係

2021-06-22 03:59:17 字數 2658 閱讀 8831

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

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()

ManyToOne 雙向一對多關係

雙向一對多關係,一是關係維護端 owner side 多是關係被維護端 inverse side 在關係被維護端需要通過 joincolumn建立外來鍵列指向關係維護端的主鍵列。public classorderimplementsserializable public classorderitem...

JPA雙向一對多關聯關係

用法和單向一對多和單向多對一用法是一樣的,需要說的就是讓那一邊來維護關聯關係,如果不考慮這個也沒什麼關係,考慮的話可以對效能有一點提公升。joincolumn name customer id public setgetorders 預設兩邊維護關聯關係 若先儲存n的一端,再儲存1的一端,則兩邊在傳...

sqlalchemy 一對多 關係

import os import sqlalchemy from sqlalchemy import create engine,column,integer,string,foreignkey,sequence from sqlalchemy.ext.declarative import decl...