inverse 在 one-to-many 中所含意義的詳細解釋

初學Hibernate很多人搞不清inverse的意義在這裏做一個詳細的解釋

首先對inverse做一個語言描述

inverse="true"即表示放棄對關係的維護權.在inverse所在的hibernate配置元素中,所有的關係改變將不被反映到數據庫中.

例如,如下兩個配置

1 Item類映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Item" table="item" catalog="hibernate">
        <id name="itemId" type="java.lang.Integer">
            <column name="ITEM_ID" />
            <generator class="identity" />
        </id>
        <property name="sellerId" type="int">
            <column name="SELLER_ID" not-null="true" />
        </property>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <set name="bids" table="bid" inverse="true" lazy="false" fetch="select">
            <key>
                <column name="ITEM_ID" not-null="true" />
            </key>
            <one-to-many class="com.hib.entity.Bid" />
        </set>
    </class>
</hibernate-mapping>

 2 Bid類映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Bid" table="bid" catalog="hibernate">
        <id name="bidId" type="java.lang.Integer">
            <column name="BID_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="item" class="com.hib.entity.Item" fetch="select">
            <column name="ITEM_ID" not-null="true" />
        </many-to-one>
        <property name="bidderId" type="java.lang.Integer">
            <column name="BIDDER_ID" />
        </property>
        <property name="amount" type="java.lang.Integer">
            <column name="AMOUNT" />
        </property>
    </class>
</hibernate-mapping>

 Item類映射文件中set元素的inverse="true"表示 Item 類的 set 集合放棄對關聯關係的維護權.也就是說,對於一個Item類的實例.改變set中的內容,在Item 的 update 和 insert 操作中將不被反映到數據庫.這句話是什麼意思.請看如下代碼.

已知條件:數據庫中.ITEM表和BID表數據如下

ITEM 表

--------------------------------------

ITEM_ID  |  NAME

---------------------------------------

1             | item1

--------------------------------------

2             | item2

---------------------------------------

BID表

----------------------------------------

BID_ID    | ITEM_ID | AMOUNT

------------------------------------------

1             | 1            | 3000

--------------------------------------------

2             | 1            | 3000

-------------------------------------------

 

執行如下java代碼

Item item=ItemDAO.getById(2);
Bid bid=BidDAO.getById(2);
item.getBids().add(bid);
ItemDAO.update(item);
 

執行完後,數據庫內容如下

ITEM 表

--------------------------------------

ITEM_ID  |  NAME

---------------------------------------

1             | item1

--------------------------------------

2             | item2

---------------------------------------

BID表

----------------------------------------

BID_ID    | ITEM_ID | AMOUNT

------------------------------------------

1             | 1            | 3000

--------------------------------------------

2             | 1            | 3000

-------------------------------------------

可以看到,數據庫沒有任何改變.

查看

Item item=ItemDAO.getById(2);
System.out.println(item.getBids().size());

 size

Item item=ItemDAO.getById(2);
System.out.println(item.getBids().size());

 

仍然爲0.再執行如下代碼

Item item=ItemDAO.getById(2);
Bid bid=BidDAO.getById(2);
bid.setItem(item)
BidDAO.update(bid);

 此時數據庫爲

ITEM 表

--------------------------------------

ITEM_ID  |  NAME

---------------------------------------

1             | item1

--------------------------------------

2             | item2

---------------------------------------

BID表

----------------------------------------

BID_ID    | ITEM_ID | AMOUNT

------------------------------------------

1             | 1            | 3000

--------------------------------------------

2             | 2            | 3000

-------------------------------------------

再執行

Item item=ItemDAO.getById(2);
System.out.println(item.getBids().size());

 size爲1,從上面可以看出.inverse="true"標誌着Item類不維護關聯關係(不反映到數據庫).而有Bid類進行維護(反映到數據庫)

如果需要讓Item類來維護關聯關係(Bid類必須放棄對關聯關係的維護)修改配置文件如下

Item 類配置文件,修改inverse="false"

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Item" table="item" catalog="hibernate">
        <id name="itemId" type="java.lang.Integer">
            <column name="ITEM_ID" />
            <generator class="identity" />
        </id>
        <property name="sellerId" type="int">
            <column name="SELLER_ID" not-null="true" />
        </property>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <set name="bids" table="bid" inverse="false" lazy="false" fetch="select">
            <key>
                <column name="ITEM_ID" not-null="true" />
            </key>
            <one-to-many class="com.hib.entity.Bid" />
        </set>
    </class>
</hibernate-mapping>

 Bid 類映射文件,修改<many-to-one>元素,添加update="false",insert="false"屬性,其意義爲,在Bid類的update與insert操作中,忽略<many-to-one>所映射的item字段,不將其反映到數據庫中

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Bid" table="bid" catalog="hibernate">
        <id name="bidId" type="java.lang.Integer">
            <column name="BID_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="item" class="com.hib.entity.Item" fetch="select" insert="false" update="false">
            <column name="ITEM_ID" not-null="true" />
        </many-to-one>
        <property name="bidderId" type="java.lang.Integer">
            <column name="BIDDER_ID" />
        </property>
        <property name="amount" type="java.lang.Integer">
            <column name="AMOUNT" />
        </property>
    </class>
</hibernate-mapping>
 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章