`
xgdellis
  • 浏览: 62038 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

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里就是同一个对象

关于上面的东西纯属我个人理解思考后得出的结论,并不一定就是正确的,如果有错误指出欢迎指点。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics