加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在插入失败后恢复Hibernate会话状态

发布时间:2020-12-15 01:12:02 所属栏目:Java 来源:网络整理
导读:以下代码尝试使用Spring Hibernate将Item对象插入到db中. Item具有Integer id字段作为主键,以及受独特约束限制的名称列(简化示例). 我知道项目的id为空(项目是暂时的)但是由于名称字段上的唯一约束,插入可能仍然失败. try { getHibernateTemplate().save(myI

以下代码尝试使用Spring Hibernate将Item对象插入到db中. Item具有Integer id字段作为主键,以及受独特约束限制的名称列(简化示例).
我知道项目的id为空(项目是暂时的)但是由于名称字段上的唯一约束,插入可能仍然失败.

try {
  getHibernateTemplate().save(myItem);
  getHibernateTemplate().flush(); // exception thrown here if the name is not unique
}
catch (DataIntegrityViolationException e) {
  Item itemFromDb = (Item) getHibernateTemplate()
    .find("from Item item where item.name = ?",myItem.getName()).get(0);
  //
  // copy some properties from myItem to itemFromDb
  //
  getHibernateTemplate.update (itemFromDb)
}

我需要这个代码在多个项目的循环中运行,所有这些都在一个事务中,这就是为什么我试图在插入失败时发出更新的原因.

但是,在插入失败后,hibernate会话处于奇怪的状态,当我发出select语句从db获取项时,抛出原始异常.

我尝试在插入失败后使用session.evict(),但无济于事.任何的想法?

这是我在选择失败后在控制台中看到的内容. Hibernate在select语句上失败,但仍然打印有关前一个insert语句的信息.

WARN  [http-8080-1] hibernate.util.JDBCExceptionReporter (JDBCExceptionReporter.java:77) - SQL Error: 2627,SQLState: 23000
ERROR [http-8080-1] hibernate.util.JDBCExceptionReporter (JDBCExceptionReporter.java:78) - Violation of UNIQUE KEY constraint 'unq_Item_name'. Cannot insert duplicate key in object 'items'.
ERROR [http-8080-1] event.def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:301) - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert: [com.sample.Item]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)

附:请不要告诉我有关hibernate的saveOrUpdate方法的信息,我知道它的作用.

最佳答案
一旦抛出数据库异常,Hibernate就不保证会话的任何内容.你应该回滚.如果我理解Bozho的建议,他说你应该先从名称栏中读取,以确保插入不会失败.我感觉合理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读