@Test
public void cascade(){
Session s= sf.openSession();
Transaction tx = s.beginTransaction();
Customer c = (Customer) s.load(Customer.class, 2);
Order o = (Order) s.load(Order.class, 4);
o.setCustomer(c); //-----1
c.getOrders().add(o);//----2
tx.commit();
}
<class name="cn.ls.domain.Customer" table="customers" lazy="false">
<id name = "id" column="id" type="integer">
<generator class="identity"></generator>
</id>
<set name="orders" cascade="save-update" >
<key column="cid" ></key>
<one-to-many class="Order" />
</set>
</class>
<hibernate-mapping package="cn.ls.domain">
<class name="Order" table="orders" lazy="false">
<id name = "id" column="id" type="integer">
<generator class="identity"></generator>
</id>
<property name="orderNo" column="orderno" type="string"></property>
<property name="price" column="price" type="float"></property>
<many-to-one name="customer" class="Customer" lazy="false" cascade="save-update" >
<column name="cid"></column>
</many-to-one>
</class>
</hibernate-mapping>
两边都设置了级联保存,这时候运行上面Java代码,1,2处 ,hibernate 会出现2次更新。而这2次更新的内容是重复的。都是更新cid。影响了性能。所以在一对多的时候,在1方的set里面设置inverse 属性为true。(默认为false)。这样的话set就忽略更新了,让对方去更新维护外键。这样只会出现一次更新。inverse属性只能在一对多的一方和多对多中使用。
Hibernate: update orders set orderno=?, price=?, cid=? where id=?
Hibernate: update orders set cid=? where id=?