Hibernate报错解决 a different object with the same identifier value was already associated with the sess

当用到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方法时,不要出现以上情况在同一个方法中。

如果碰到这个问题,请仔细检查,所有的实体对象返回值中,有没有针对同一条数据的两个返回值。


总结:上边那个错误的代码例子写的很傻比,我也认为我不会发生这样的错误。但是这个例子只是告诉大家,在一个逻辑复杂的方法中,需要多次

对数据库数据进行请求,并且数据与数据之间有着内部键关联时,就很容易出现这样的错误。我也是在做管理域迭代的时候研究的这个错误。


经验分享,仁者见仁,勿喷!!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值