Hibernate 建立一對多雙向關聯關係,hibernate關聯
以下內容整理自《精通Hibernate》第二版
註:既然是雙向關聯,“一對多雙向關聯”和“多對一雙向關聯”是同一回事。
對象位於記憶體中,在記憶體中從一個對象導航到另一個對象顯然比到資料庫中查詢資料的速度快多了。但是複雜的關聯關聯也會給編程帶來麻煩,因此類與類之間是建立單向關聯還是雙向關聯要由業務需求決定。
如果軟體應用有大量這樣的需求:
1、根據給定的客戶,查詢該客戶的所有訂單。
2、根據給定的訂單,查詢發出訂單的客戶。
根據以上需求,不妨為Customer類和Order類建立一對多雙向關聯。在上篇文章中介紹了Hibernate如何建立多對一的單向關聯(Order類到Customer類的多對一關聯),在此不再贅述。
增加Customer類到Order類的一對多關聯,首先需要在Customer類中增加一個集合類型的orders屬性:
<span style="font-size:18px;">/** 在定義orders集合屬性時將它初始化為集合實作類別的一個執行個體,*這可以提高程式的健壯性,避免應用程式訪問取值為null的orders集合的方法而拋出NullPointerException */private Set orders = new HashSet();public Set getOrders(){ return orders;}public void setOrders(Set orders){ this.orders = orders;}</span>
之後在Customer類的Hibernate對應檔中添加以下內容:
<span style="font-size:18px;"><set name="orders" cascade="save-update" > <key column="CUSTOMER_ID" /> <one-to-many class="mypack.Order"/></set></span>
<set>元素包括以下屬性。
name:設定待映射的持久化類的屬性的名字,此處為Customer類的orders屬性。
cascade:當取值為"save-update",表示級聯儲存和更新。
<key>子項目:設定父方在子放中的外鍵,此處為“CUSTOMER_ID”,表明ORDERS表通過外鍵CUSTOMER_ID參照CUSTOMER表。
<one-to-many>子項目:表明orders集合中存放的是一組Order對象。
如果希望Hibernate刪除Customer對象時,自動刪除和Customer關聯的Order對象,可以把cascade屬性設為“delete”。
如果希望Hibernate自動刪除不再和Customer對象關聯的Order對象,可以把cascade屬性設為“all-delete-orphan”。