繁体   English   中英

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

[英]Hibernate transaction throws exception from another transaction

我正在尝试使用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:唯一约束

我应该从另一个会话中查询数据还是将两个事务彼此隔离的另一种方法是什么?

谢谢!

如果遇到异常,则不应使用相同的会话,而必须关闭该会话并为第二个操作使用其他会话。 这在休眠文档中给出:

13.2.3异常处理

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

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

您是否可以尝试使用session.persist方法替换session.save(),希望这可以解决您的问题。 有关这两种方法的更多详细信息,请参考以下链接。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM