hibernate的级联保存中遇到的一个问题

以下是我级联保存的做法:
[b]双向一对多[/b]
1. 在一的一端设置级联(cascade="save-update")
2. 不要让一的一端来维护关系(set中的设置inverse="true")
3. 保存时一的一端添加多的一端(set.add()),多的一端设置一的一端(setXX())
4. 保存一的一端

[b]双向多对多[/b]
1. 在A端设置级联(cascade="save-update")以及关系维护(inverse="false")
2. 保存时A端添加B端(set.add())
3. 保存A端

这两种都存在一个问题:若其中的一端(比如一对多里多的一端)已存在,则会产生update语句来修改该端的表,即使这个表都没有被修改过。我的猜测是由于有设置cascade,所以会有级联的操作,而且级联操作调用的是saveOrUpdate,那么表既然存在所以是update了。这个问题比较讨厌,不知道能不能不要产生update语句。

相关的测试是:

TestEnterprise(企业)----TestUser(人员),他们之间是一个一对多的关系

其中TestEnterprise的相关配置

<set name="testUsers" inverse="true" cascade="save-update">
<key>
<column name="EID" precision="22" scale="0" />
</key>
<one-to-many class="domain.TestUser" />
</set>


TestUser的相关配置

<many-to-one name="testEnterprise" class="domain.TestEnterprise" fetch="select">
<column name="EID" precision="22" scale="0" />
</many-to-one>


测试代码

TestEnterprise enterprise = new TestEnterprise();
enterprise.setName("xxx");

TestUser user = dao.getById(6l, TestUser.class);

enterprise.getTestUsers().add(user);
user.setTestEnterprise(enterprise);

dao.save(enterprise);


控制台显示

select testuser0_.ID as ID1_0_, testuser0_.EID as EID1_0_, testuser0_.NAME as NAME1_0_, testuser0_.PASSWORD as PASSWORD1_0_, testuser0_.STATUS as STATUS1_0_ from DBO.TEST_USER testuser0_ where testuser0_.ID=?
select max(ID) from TEST_ENTERPRISE
insert into DBO.TEST_ENTERPRISE (NAME, ID) values (?, ?)
update DBO.TEST_USER set EID=?, NAME=?, PASSWORD=?, STATUS=? where ID=?


就是最后多了一个update语句,如果我把 cascade="save-update"去掉的话就不会有了,但是这样显然不行。另外这个问题和保存一的一端还是保存多的一端都没什么关系,无论保存的是哪端都有产生这样的问题。现在请教各位了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值