提问者:小点点

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


我正在尝试使用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个答案

匿名用户

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

13.2.3异常处理

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

匿名用户

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

匿名用户

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

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