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的事情.
如果還是不清楚.可以參考這一篇文章看