Hibernate级联设置

在hibernate中一对多关联时会经常用到inversecascade属性

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

相关推荐