identifier of an instance of Entity is altered from 41 to 43

本文解析了Hibernate在提交事务时出现的错误Caused by: org.hibernate.HibernateException,并提供了详细的错误原因及解决办法。同时,文章还探讨了可能导致该错误的其他原因。
hibernate提交事务时报如下错误:
Caused by: org.hibernate.HibernateException:
identifier of an instance of user is alterde from from 41 to 43。

导致该错误的代码如下:
private User user = new Usesr();
public void save(){
Session session=HibernateSessionFactory.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.saveOrUpdate(user);
tx.commit();
} catch (HibernateException e) {
tx.rollback();
log.error("Error: " + e.getMessage());
}
}

导致该错误的原因:
在使用seam框架中将一个action类的上下文范围定义page范围,访问一个注册页面,
添加注册信息,调用该action类保存后,如果页面还是返回到注册页面(即返回到原页面),
当再次填写注册信息保存时,由于该action类的上下文范围是page范围,上一次保存的user对象还存在,
导致再次保存user对象提交事务插入时hibernate认为第二次保存的对象与之前的对象是同一个对象,之前的主键被更新,因此报错。

解决办法:
在每次提交事务后再立即新建一个对象。

正确的代码如下:
private User user = new Usesr();
public void save(){
Session session=HibernateSessionFactory.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.saveOrUpdate(user);
tx.commit();
[color=red]user = new User();[/color]
} catch (HibernateException e) {
tx.rollback();
log.error("Error: " + e.getMessage());
}
}

导致该错误的其它原因可能还有:
hibernate hbm里面id的type和java文件里面的不一致!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值