hibernate的级联保存中遇到的一个问题
以下是我级联保存的做法:
双向一对多
1.在一的一端设置级联(cascade="save-update")
2.不要让一的一端来维护关系(set中的设置inverse="true")
3.保存时一的一端添加多的一端(set.add()),多的一端设置一的一端(setXX())
4.保存一的一端
双向多对多
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"去掉的话就不会有了,但是这样显然不行。另外这个问题和保存一的一端还是保存多的一端都没什么关系,无论保存的是哪端都有产生这样的问题。现在请教各位了。
相关推荐
wanwanwandj 2020-05-25
阿斌Elements 2020-05-15
xiaoxiaoCNDS 2020-04-20
时光如瑾雨微凉 2019-12-28
云端漂移 2019-11-18
趣IT 2019-11-03
80447704 2019-10-19
雷潇 2019-03-26
moyazheng 2014-09-23
CXYZPH 2019-07-08
fwens 2013-08-05
廖金龙 2019-06-28
ChinaBowen 2012-12-06
无道圣教主 2012-08-19
Kindlecode 2016-05-25
chenssss 2011-12-22
shiTou工作室 2011-10-29
javamagicsun 2019-06-27