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

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();
    user = new User();
  } catch (HibernateException e) {
tx.rollback();
log.error("Error: " + e.getMessage());
  }
}

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

你可能感兴趣的:(Hibernate,框架,seam)