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"去掉的話就不會有了,但是這樣顯然不行。另外這個問題和保存一的一端還是保存多的一端都沒什麼關係,無論保存的是哪端都有產生這樣的問題。現在請教各位了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章