我最近在復(fù)習(xí)一下關(guān)于Hibernate關(guān)系映射的知識(shí),看了書本的介紹以及視頻。這幾篇博客都是對(duì)學(xué)到知識(shí)的一點(diǎn)總結(jié)。當(dāng)然,這些這是最基本的能夠?qū)崿F(xiàn)關(guān)聯(lián)關(guān)系的配置,在實(shí)際的使用中,還有很多參數(shù)需要根據(jù)情況來設(shè)置。但也算是對(duì)以后開發(fā)過程中遇到遺忘的地方可以進(jìn)行查閱。
在本文中使用的Demo也都已經(jīng)上傳到github中,里邊有詳細(xì)的運(yùn)行說明。Github地址:HibernateRelationMapping
對(duì)于1-N關(guān)聯(lián),Hibernate推薦使用雙向關(guān)聯(lián),而且不要讓1的一端控制關(guān)聯(lián)關(guān)系,而使用N的一端控制關(guān)聯(lián)關(guān)系。
雙向的N-1關(guān)聯(lián)與1-N關(guān)聯(lián)是完全相同的兩種情形。兩端都需要增加對(duì)關(guān)聯(lián)屬性的訪問,N的一端增加引用到關(guān)聯(lián)實(shí)體的屬性,1的一端增加集合屬性,集合元素為關(guān)聯(lián)實(shí)體。
從 Order 到 Customer 的多對(duì)一雙向關(guān)聯(lián)需要在Order 類中定義一個(gè) Customer 屬性, 而在 Customer 類中需定義存放 Order 對(duì)象的集合屬性
ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主鍵
當(dāng)Session從數(shù)據(jù)庫中加載Java集合時(shí),創(chuàng)建的是Hibernate內(nèi)置集合類的實(shí)例,因此,在持久化類中定義集合屬性時(shí),必須把屬性聲明為Java接口
在定義集合屬性時(shí),通常把它初始化為集合實(shí)現(xiàn)類的一個(gè)實(shí)例,這樣可以提高程序的健壯性,避免應(yīng)用程序訪問取值為null的集合的方法。
例如:private Set<Order> orders = new HashSet<Order>();
public class Customer {
private Integer customerId;
private String customerName;
private Set<Order> orders = new HashSet<Order>();
//省去get和set
}
public class Order {
private Integer orderId;
private String orderName;
private Customer customer;
//省去get和set
}
<hibernate-mapping package="com.lihui.hibernate.double_n_1">
<class name="Customer" table="CUSTOMERS">
<id name="customerId" type="java.lang.Integer">
<column name="CUSTOMER_ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
<set name="orders" inverse="true">
<key column="CUSTOMER_ID"></key>
<one-to-many class="Order"/>
</set>
</class>
</hibernate-mapping>
name屬性: 設(shè)定待映射的持久化類的屬性的
inverse 屬性:
order-by 屬性:
設(shè)定與所關(guān)聯(lián)的持久化類對(duì)應(yīng)的表的外鍵
設(shè)定集合屬性中所關(guān)聯(lián)的持久化類
<hibernate-mapping package="com.lihui.hibernate.double_n_1">
<class name="Order" table="ORDERS">
<id name="orderId" type="java.lang.Integer">
<column name="ORDER_ID" />
<generator class="native" />
</id>
<property name="orderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property>
<many-to-one name="customer" class="Customer" cascade="all" column="CUSTOMER_ID"></many-to-one>
</class>
</hibernate-mapping>
更多建議: