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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值