hibernate常見級聯操作異常及解決方法
阿新 • • 發佈:2019-02-09
異常1:not-null property references a null or transient value
解決方法:將“一對多”關係中的“一”方,not-null設定為false
(參考資料:http://www.thearcmind.com/confluence/pages/viewpage.action?pageId=212)異常2:org.hibernate.TransientObjectException: object references an unsaved transient instance
解決方法:cascade="save-update,persist"
(參考資料:http://www.laliluna.de/254.html)
異常3:org.hibernate.QueryException: could not resolve property
解決方法:"from Category category where category.userID = :userID"修改為"from Category category whereuserID = :userID"或者"from Category category where category.user.id = :userID"
(參考資料:http://www.laliluna.de/277.html)異常4:could not initialize proxy - the owning Session was closed
解決方法:設定lazy為false
(參考資料:http://forum.springframework.org/showthread.php?t=27993)
異常2我在應用中碰到了這樣的問題:
有三個表:userInfo deptmentInfo role
userInfo 與deptmentInfo為many to one
userInfo 與role為many to one
下面為儲存UserInfo物件時的程式碼:
DeptmentInfo dept = new DeptmentInfo();
dept.setDeptName(deptName);
Role role = new Role();
role.setRoleName(roleName);
UserInfo user = new UserInfo();
user.setUserName(userName);
user.setUserSex(userSex);
user.setDuty(duty);
user.setPhone(phone);
user.setMobileNum(mobileNum);
user.setEmail(email);
user.setQq(qq);
user.setMsn(msn);
user.setAdress(adress);
user.setDeptmentInfo(dept);
user.setRole(role);
dao.save(user);
執行時有錯:org.hibernate.TransientObjectException: object references an unsaved transient instance
於是改了UserInfo.hbm.xml的一些地方
如下:
<many-to-one name="role" class="com.oa.domain.Role"
cascade="save-update,persist" fetch="select">
<column name="ROLE_ID" precision="22" scale="0" />
</many-to-one>
<many-to-one name="deptmentInfo"
class="com.oa.domain.DeptmentInfo" cascade="save-update,persist"
fetch="select">
<column name="DEPT_ID" precision="22" scale="0" />
</many-to-one>
加了上面紅色部分,就OK了,能儲存了。