当前位置: 首页 > 知识库问答 >
问题:

Hibernate事务引发另一个事务的异常

宓季同
2023-03-14

我正在尝试使用Hibernate保存数据。一切都发生在同一会话中。逻辑如下:

1)开始交易并尝试保存:

try
{

  session.getTransaction().begin();
  session.save(result);
  session.getTransaction().commit();
}
catch (Exception e)
{
  session.getTransaction().rollback();
  throw e;
}

2) 如果新记录违反完整性约束,请在外包装方法中捕获异常,打开另一个事务并查询更多数据

catch (ConstraintViolationException e)
{
  if ("23000".equals(e.getSQLException().getSQLState()))
  {
    ...

    session.getTransaction().begin();
    Query query = session.createQuery("from Appointment a where a.begin >= :begin and a.end <= :end");
    query.setDate("begin", date);
    query.setDate("end", DateUtils.addDays(date, 1));

    List results = query.list();
    session.getTransaction().commit();

问题是当第二个事务执行时query.list它会抛出一个应该与前一个事务链接的异常。

SQLIntegrityConstraintViolationException:ORA-00001:唯一约束

我应该从另一个会话中查询数据,还是用其他方法将两个事务相互隔离?

谢谢!

共有3个答案

姚星宇
2023-03-14

你可以尝试用session.persist方法replce session.save(),希望这可以解决你的问题。有关这两种方法的更多详细信息,请参阅以下链接。

在Hibernate中,persist()与save()的优势是什么?

邹普松
2023-03-14

希望异常类是所有类型异常的基础,因此如果它被放置在它之前,它将始终被捕获,并且其余的异常处理是隔离的。

庞意智
2023-03-14

如果遇到异常,您不应该使用同一个会话,您必须关闭会话并使用不同的会话进行第二次操作。这在hibernate留档中给出:

13.2.3异常处理

如果会话抛出异常,包括任何SQLException,立即回滚数据库事务,调用Session.close()并丢弃会话实例。会话的某些方法不会使会话处于一致状态。Hibernate抛出的任何异常都不能被视为可恢复的。确保通过在last块中调用off()来关闭会话。

 类似资料:
  • 本文向大家介绍Spring如何在一个事务中开启另一个事务,包括了Spring如何在一个事务中开启另一个事务的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring如何在一个事务中开启另一个事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 spring使用@Transactional开启事务,而且该注解使用propagation属

  • 我有办法: 和每个内部事务的另一个bean: 当我第一次尝试保存时,我有20行DB。每次下一次保存,我得到+10行。名称具有约束。当我得到错误时,事务是提交而不是继续。每次保存后我都会等待98行。

  • 我在Hibernate中看到了以下属性。cfg。一个企业(EJB)应用程序中的xml。我不知道这到底意味着什么。 我在代码中没有找到任何与事务相关的东西,比如begin transaction或commit,相反,我只看到sessionFactory。openSession()和会话。flush()。如果启用了上述配置,如何管理事务。

  • 我有相同的模块,连接数据库运行在两个服务器(后台和前台)。它与同一个数据库连接。 我使用JPA(Hibernate实现)和Spring事务管理。 我有以下问题: 我必须用两个不同字段的最大值1更新表a中的字段a(表a中的字段a,表b中的字段b) 案例1: 更新前 表A fA = 100 tableB fB=102 更新后 表a fA=103 tableB fB=102 案例2: 更新前 表A fA

  • 问题内容: 为了了解Spring事务的工作原理,我想知道在以下情况下发生的情况:如果一种方法标记为,而另一种方法标记为。 假设配置使用所有默认设置。 现在,如果我要输入,显然可以开始交易。然后,钻进去会发生什么?交易已经存在的事实会导致没有新的交易诞生,还是我在这里创建两个交易? 关于Propagation的文档(在下面引用)似乎涵盖了这一点,但是我想验证一下我的理解 Propagation:通常

  • 我在使用Hibernate实现的事务服务层中具有以下方法: 可以看到,在< code > else if(user account . is expired())块中,我想先删除< code>userAccount,然后抛出一个异常。但是由于它抛出了一个异常,并突然退出该方法,所以没有执行delete。 我想知道是否有任何方法可以在抛出异常时坚持删除操作。