inverse與cascade的情侶式意義分辨

inverse和cascade在hibernate裏是毫無關係的.inverse只用於限定被關聯的一方放棄對關係的維護權.由被關聯的另一方維護關係.(且只關注在關係維護上,不涉及實例的具體數據的維護)

cascade 負責維護級聯數據的持久化.簡單來說就是負責維護關聯的雙方的具體數據持久化到數據庫.

比如有兩個類Item,Bid,從Item到Bid一對多<one-to-many>關聯,且inverse="true",即配置如下

<?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>

 

<?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" update="false" insert="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>

 

如下代碼是無效的

item.getBids().iterator.next().setAmout(900);
itemDAO.update(item);

 

bid的amount屬性900不會反應到數據庫裏.而如下代碼是生效的

item.getBids().clear();
itemDAO.update(item);

 

說明item與bid的關聯被取消了,並且反應到了數據庫.現在改變item的配置文件,添加cascade元素

<?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" cascade="save-update">
            <key>
                <column name="ITEM_ID" not-null="true" />
            </key>
            <one-to-many class="com.hib.entity.Bid" />
        </set>
    </class>
</hibernate-mapping>

 

執行同樣的代碼

item.getBids().iterator.next().setAmout(900);
itemDAO.update(item);

 這時候amout屬性的改變就會反應到數據庫了.

下面用一個形象的比喻來說明inverse和cascade是如何沒有關係的.

吧Item和Bid類比喻成一對戀人Item(男),Bid(女).數據庫是情侶登記處.每一對登記的情侶必須登記兩種類型的數據一是"關係"(比如bid1是item1的女朋友)二是數據(比如item1和bid1身上各自所穿的衣服)

inverse只管item1和bid1還是不是男女朋友.至於這兩人今天穿什麼衣服.inverse是一律不管的.如果item1和bid1分手了.它就把這種變化的關係更新到情侶登記處(數據庫).而至於item1和bid1身上所穿的衣服,不管是不是和上次一樣.即使不一樣,也不會在情侶登記處裏更新.

而cascade則只管這對情侶所穿的衣服

比如item1和bid1再一次來到情侶登記處.cascade只把這次兩人所穿的衣服(數據)更新的登記處(數據庫)而至於兩人是來分手的,還是結婚的.一律不管.那是inverse的事情.

如果還是不清楚.可以參考這一篇文章看

http://chen-rojer-gmail-com.iteye.com/admin/blogs/642988

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