Hibernate中cascade与inverse

[color=red][size=large]cascade:[/size][/color]
当Hibernate持久化一个"自由态对象"时,在默认的情况下(没有设置cascade或cascade=none时),Hibernate不会自动持久化他所关联的其他临时对象。在cascade="save-update"或者cascade="all"时,当Hibernate向数据库表中插入"新"对象记录时,会检查该对象所关联的属性是否发生变化,如果发生变化,就按照级联属性(cascade)所设定的内容进行操作。

如一个person类和一个QQ类,他们是one-to-many的关系。person类中qqs属性对应配置文件set的cascade属性设为cascade="save-update"。

Person p = new Person();
p.setName("zhangsan");

QQ qq = new QQ();
qq.setNum("1111");
qq.setPerson(p);

p.getQqs().add(qq);

getSession().save(p);


[color=red][size=large]inverse[/size][/color]
在Hibernate执行getSession().save(p)这段代码时通过show_sql开启显示sql语句功能,那么控制台将会显示3条sql语句。
第一条是将新的数据插入person,第二条是插入qq,而第三条是一条update语句。
我们先来看一下数据库,在person表和qq表中,qq表是外键表,qq表中的person_id是外键,即两表存在主外键关联。
当调用p.getQqs().add(qq)方法,进行添加时,Hibernate怕在进行p.getQqs().add(qq)这样的操作时出现意外情况,即添加方(qq)和被添加方(p)存在外键不一致的情况。所以就会出现那条更新语句。
inverse的默认值为false,所以inverse属性默认会进行“关联更新”。inverse值为true,会放弃“关联更新”。
通俗点讲,将inverse设为false的那一方,意思就是你添加完信息后我还要来维护一下,所以会出现update语句,如果将inverse设为true的话,意思就是我完全相信你,你添加后我就不需要在维护了,所以不会出现update语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值