我最近在復(fù)習(xí)一下關(guān)于Hibernate關(guān)系映射的知識,看了書本的介紹以及視頻。這幾篇博客都是對學(xué)到知識的一點(diǎn)總結(jié)。當(dāng)然,這些這是最基本的能夠?qū)崿F(xiàn)關(guān)聯(lián)關(guān)系的配置,在實(shí)際的使用中,還有很多參數(shù)需要根據(jù)情況來設(shè)置。但也算是對以后開發(fā)過程中遇到遺忘的地方可以進(jìn)行查閱。
在本文中使用的Demo也都已經(jīng)上傳到github中,里邊有詳細(xì)的運(yùn)行說明。Github地址:HibernateRelationMapping
單向N-1關(guān)系,比如多個(gè)人對應(yīng)一個(gè)地址,只需從人實(shí)體端可以找到對應(yīng)的地址實(shí)體,無須關(guān)系某個(gè)地址的全部住戶。
單向 n-1 關(guān)聯(lián)只需從 n 的一端可以訪問 1 的一端。
從 Order 到 Customer 的多對一單向關(guān)聯(lián)需要在Order 類中定義一個(gè) Customer 屬性, 而在 Customer 類中無需定義存放 Order 對象的集合屬性
ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主鍵
Hibernate 使用 元素來映射多對一關(guān)聯(lián)關(guān)系<many-to-one name="customer" class="Customer" column="CUSTOMER_ID" cascade="all" />
下面是實(shí)體對象,分為Customer(顧客)和Order(訂單),其中訂單和顧客是N-1關(guān)系。
public class Customer {
private Integer customerId;
private String customerName;
//省去get和set方法
}
public class Order {
private Integer orderId;
private String orderName;
private Customer customer;
//省去get和set方法
}
Customer.hbm.xml
<hibernate-mapping>
<class name="com.lihui.hibernate.single_n_1.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>
</class>
</hibernate-mapping>
Order.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.single_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" column="CUSTOMER_ID" cascade="all" />
</class>
</hibernate-mapping>
Junit Test由于在Order.hbm.xml中配置了cascade="all"
,所以只需要保存order對象即可,會首先自動保存級聯(lián)的Customer對象。
@Test
public void testSave() {
Customer customer = new Customer();
customer.setCustomerName("a");
Order order1 = new Order();
order1.setOrderName("A");
order1.setCustomer(customer);
Order order2 = new Order();
order2.setOrderName("B");
order2.setCustomer(customer);
session.save(order1);
session.save(order2);
}
更多建議: