我正在尝试使用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:唯一约束
我应该从另一个会话中查询数据,还是用其他方法将两个事务相互隔离?
谢谢!
如果遇到异常,您不应该使用同一个会话,您必须关闭会话并使用不同的会话进行第二次操作。这在hibernate留档中给出:
13.2.3异常处理
如果会话抛出异常,包括任何SQLException,立即回滚数据库事务,调用Session.close()并丢弃会话实例。会话的某些方法不会使会话处于一致状态。Hibernate抛出的任何异常都不能被视为可恢复的。确保通过在last块中调用off()来关闭会话。
希望异常类是所有类型异常的基础,因此如果它被放置在它之前,它将始终被捕获,并且其余的异常处理是隔离的。
你可以尝试用session.persist方法replce session.save(),希望这可以解决你的问题。有关这两种方法的更多详细信息,请参阅以下链接。
在Hibernate中,persist()与save()的优势是什么?