Hibernate级联设置
在hibernate中一对多关联时会经常用到inverse和cascade属性
inverse 有两个值 true、false;如果设置为true 则表示当前对象不负责将级联对象的状态变化同步到数据库;设置false则相反。其默认值为false。
cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;
all:所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
delete-orphan:当save/update/saveOrUpdate时,相当于save-update;当删除操作时,相当于delete;
all的意思是save-update+delete
all-delete-orphan的意思是当对象图中产生孤儿节点时,在数据库中删除该节点
all比较好理解,举个例子说一下all-delete-orphan:
Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items.
举个例子,现items中存两个Item,item1,item2,如果定义关系为all-delete-orphan
当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例
将变成孤儿节点,当执行category.update(),或session.flush()时
hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉inverse设定的原则:
1.在映射一对多双向关联关系时,应该设定many方的inverse为true,以提高性能
2. 在建立两个对象的双向关联时,应同时修改关联两端的对象的相应属性:多对多关联关系删除、保存的配置如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="com.hibernate.entity">
<class name="EventManyToMany" table="m_events">
<id name="id" column="uid" type="long" unsaved-value="null">
<generator class="increment"/>
</id>
<property name="name" type="string" length="100"/>
<property name="startDate" column="start_date"
type="java.sql.Timestamp"/>
<property name="duration" type="java.lang.Integer"/>
<many-to-one name="location" column="location_id"
class="LocationManyToMany"/>
<set access="property" name="speakers" table="event_speakers" cascade="save-update">
<key column="event_id"/>
<many-to-many class="SpeakerManyToMany"/>
</set>
</class>
</hibernate-mapping>cascade的设定原则:
1.多对多关联关系设置的cascade="save-update",
2.一对多、一对一关联关系设置的cascade值则依照需求设置
附 hibernate cascade备忘:
当关联双方存在父子关系,就可以在set处设定cascade为all-delete-orphan
所谓父子关系,即指由父方控制子方的持久化生命周期,子方对象必须和一个父方对象关系。如果删除父方对象,应该级联删除所有关联的子方对象;如果一个子方对象不再和一个父方对象关联,应该把这个子方对象删除。
all-delete-orphan的能力:
1.当保存或更新父方对象时,级联保存或更新所有关联的子方对象,相当于cascade为save-update
2.当删除父方对象时,级联删除所有关联的子方对象,相当于cascade为delete
3.删除不再和父方对象关联的所有子方对象
解除父子关系的java语句例如:
customer.getOrders().remove(order);
order.setCustomer(null);
tx.commit();
如果cascade属性取默认值null,当解除父子关系时,会执行如下sql:
update ORDER set CUSTOMER_ID = null where ID = 2