我试图用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它抛出should'be被与前一事务链接异常。
SQLIntegrityConstraintViolationException:ORA-00001:唯一约束
我应该从另一个会话查询数据或者有什么其他的方式来彼此隔离两笔交易?
谢谢!
我想在第二种情况下,当抛出异常并且稍后查询第二个事务时,必须回滚catch块中的第一个事务。目前您刚刚开始第二笔交易时出现错误,因为第一笔交易尚未回滚 – vikeng21 2014-10-06 04:42:52
@ vikeng21,不是真的,第一个模块拥有自己的“catch(Exception e)”,它会回滚第一笔交易。然后它重新抛出一个异常,它被第二个块捕获,第二个事务开始。 – andreybavt 2014-10-06 04:47:18
哦,好吧,它们是代码的相同部分,但是您的异常hirerchy不正确,您的会话对象是全局权限。你可以尝试创建一个新的会话对象,因为我们可以创建会话对象的每个事务。你的异常看起来像插入相关,但你实际上运行一个选择查询不知道为什么你得到它 – vikeng21 2014-10-06 04:56:03