Hibernate關(guān)系映射1:單向N-1關(guān)聯(lián)

2018-09-28 14:18 更新

我最近在復(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)聯(lián)


單向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 對象的集合屬性

圖1

關(guān)系數(shù)據(jù)模型

ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主鍵圖2

Demo

Hibernate 使用 元素來映射多對一關(guān)聯(lián)關(guān)系<many-to-one name="customer" class="Customer" column="CUSTOMER_ID" cascade="all" />

  • name: 設(shè)定待映射的持久化類的屬性的名字
  • column: 設(shè)定和持久化類的屬性對應(yīng)的表的外鍵
  • class:設(shè)定待映射的持久化類的屬性的類型
  • cascade:意味著系統(tǒng)將先自動級聯(lián)插入主表記錄,也就是說先持久化Customer對象,再持久化Person對象。開發(fā)時(shí)不建議使用該屬性,建議使用手工的方式。

下面是實(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);
    }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號