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里就是同一个对象。
关于上面的东西纯属我个人理解思考后得出的结论,并不一定就是正确的,如果有错误指出欢迎指点。