当用到Hibernate中saveOrUpdate()方法时,有时候会报错 a different object with the same identifier value was already associated with the session。经过研究发现了这个问题的根源供大家分享。
1.这个错误什么意思?
这个错误的意思就是在Hibernate的session中存在了两个对象去标记同一个实体。代码举例:
正确的代码:
public void saveUser(User user) { //User 是一个实体类,当做参数传入了saveUser()方法。假设当前User 的id为1。
session.saveOrUpdate(user); //此时就会将id为1的user存入mysql的user表,并且没有任何报错信息。
}
发生错误的代码:
public void saveUser(Useruserr) { //User 是一个实体类,当做参数传入了saveUser()方法。假设当前User 的id为1。
Useruser1= this.userDao.findById(1);
session.saveOrUpdate(user1);
session.saveOrUpdate(user);
}
很明显参数user和新查询的user1拥有同一个id,在session中有这相同的标记。所以在调用saveOrUpdate的时候,session会同事发现两个相同标记
的实体对象,所以会报错。
2.解决办法
在调用hibernate的saveOrUpdate方法时,不要出现以上情况在同一个方法中。
如果碰到这个问题,请仔细检查,所有的实体对象返回值中,有没有针对同一条数据的两个返回值。
总结:上边那个错误的代码例子写的很傻比,我也认为我不会发生这样的错误。但是这个例子只是告诉大家,在一个逻辑复杂的方法中,需要多次
对数据库数据进行请求,并且数据与数据之间有着内部键关联时,就很容易出现这样的错误。我也是在做管理域迭代的时候研究的这个错误。
经验分享,仁者见仁,勿喷!!!