天天看點

hibernate異常:different object with the same identifier value was already associat

近來一直在忙項目,項目用的是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裡就是同一個對象。

關于上面的東西純屬我個人了解思考後得出的結論,并不一定就是正确的,如果有錯誤指出歡迎指點。

繼續閱讀