近來一直在忙項目,項目用的是SSH。而且是在springside的基礎上做開發。用過springside的朋友,都應該知道springside用的是paramsPrepareParamsStack這個神奇的攔截器的功能。我要講的并不是這方面的東西,是以不再做詳細介紹,直奔主題。
這兩天我遇到了個非常讓人摸不着頭腦的異常“different object with the same identifier value was already associated with the session”,這是在使用繼承于SimpleHibernateDao的Dao類的save操作時報出來的異常。
具體代碼是:
AdminAction.java:
....public String personalSave() throws Exception {
adminManager.personalSave(admin);
return "personal-reload";
}
//TODO 為什麼有了這個方法不會報“a different object with the same identifier。。”這個錯了
public void preparePersonalSave() throws Exception {
this.prepareModel();
}
@Override
protected void prepareModel() throws Exception {
if (id != null && !id.equals("")) {
admin = adminManager.findById(id);
} else {
admin = new Admin();
}
}........
AdminManager.java
....
public void personalSave(Admin admin) {
Admin a = this.findByLoginName(null);
// TODO 測試list的equals
if (admin.getId().equals(a.getId())
&& admin.getLoginName().equals(a.getLoginName())
&& admin.getPositions().equals(a.getPositions())) {
adminDao.save(admin);
}
}
...
一開始,我并沒有為AdminAction裡的personalSave()方法寫一個對應的preparePersonalSave()方法,當程式運作到AdminManager裡的personalSave()方法裡的adminDao.save(admin)後就會報出那個異常。一開始,這樣我非常困擾,試過很多方法都不能解決。苦想許久後,靈機一動,心想會不會是少了preparePersonalSave()的問題,當我加上preparePersonalSave()後,問題果然解決了。
原來這個異常說的是session裡存在id相同的不同對象,導緻儲存操作的時候hibernate不知道儲存哪個。而通過prepareModel()方法取出來的對象和通過findByLoginName()方法取出來的對象在session裡是同一個對象,是以不會造成這種沖突,自然也不會報這個異常了。
上面所說的prepareModel()和findByLoginName()方法是我自己寫的從資料庫裡面查找出對象的方法,我想表達的意思是:用hibernate的get,load,query等方法分别查出來的對象,隻要對應着資料庫裡的同一條資料,那麼在hibernate的session裡就是同一個對象。
關于上面的東西純屬我個人了解思考後得出的結論,并不一定就是正确的,如果有錯誤指出歡迎指點。