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