Hibernate-inverse迷惑

1.

“set的inverse属性决定是否把对set的改动反映到数据库中去。
inverse=false————反映;inverse=true————不反映”
inverse属性默认为false

     以一对多为例子:Person(one方)---Address(many方)

  1. <set name="address" table="address" cascade="all"
  2.             inverse="true">
  3.             <key>
  4.                 <column name="pid" length="32" />
  5.             </key>
  6.             <one-to-many class="org.hibernate.demo06.pojo.Address" />
  7.  </set>

当我们更新Person的时侯,我们同时per.setAddress(null);

inverse =false 执行了hql如下:

Hibernate: update mldn.person set name=?, age=? where pid=?
Hibernate: update mldn.address set pid=null where pid=?

inverse =true 执行了hql如下:

Hibernate: update mldn.person set name=?, age=? where pid=?

 

可以看出:

inverse=false时,对Person的Address-set的改变会更新数据库中的address表,既是数据库保存了修改。

 

注:inverse 对set + one-to-many 和 set + many-to-many 起的作用不同。hibernate生成的sql不同。
对one-to-many,hibernate对many方的数据库表执行update语句。
对many-to-many, hibernate对关系表执行insert/update/delte语句,注意不是对many方的数据库表而是关系表。

建议:只对set + many-to-many设置inverse=false,其他的标记不考虑inverse属性,都设为inverse=true。
对cascade,一般对many-to-one,many-to-many,constrained=true的one-to-one 不设置级联删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值