使用MySQL和Hibernate 4.3.5
我在Mortgage
表格中有一行主键091210
。在使用hibernate的Java应用程序中,当我(错误地)尝试使用相同的密钥保存抵押时,会记录正确的com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'
异常,不会抛出。
问题:
抛出/记录此异常但程序未完成执行或终止。此外,我注意到在原始行上创建了更新/删除锁定,导致重复的异常。恢复的唯一方法是,如果我可以手动终止程序,然后orignial行不再“锁定”
我希望这种异常会取消/中断事务,然后抛出异常。但相反,似乎只记录了异常,在DB上创建了一个锁,并且该过程似乎只挂在transaction.commit()
...
代码:
System.out.println("Begin transaction");
session.beginTransaction();
System.out.println("Save mortgage");
session.save(mortgage);
System.out.println("Commit transaction");
session.getTransaction().commit();
System.out.println("Close session");
session.close();
System.out.println("Close SessionFactory");
HibernateUtil.getSessionFactory().close();
相关输出我看到了:
Begin transaction
Save mortgage
Commit transaction
Hibernate: insert into mortgage (address, last_name, inst_id, date, mortgage_num) values (?, ?, ?, ?, ?)
Mar 30, 2015 7:59:54 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
...
Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'
然后程序挂起,仍然以红灯发光运行,并锁定数据库。
没有try-catch
,没有记录。这是来自Eclipse控制台。
答案 0 :(得分:0)
让我把答案放在这里,这样我就可以正确格式化代码......
在您的代码中,添加一些错误处理:
try {
System.out.println("Begin transaction");
session.beginTransaction();
System.out.println("Save mortgage");
session.save(mortgage);
System.out.println("Commit transaction");
session.getTransaction().commit();
System.out.println("Close session");
session.close();
System.out.println("Close SessionFactory");
HibernateUtil.getSessionFactory().close();
} catch (HibernateException he) {
he.printStackTrace();
}
这会将整个堆栈跟踪打印到您的控制台。有更好的方法来记录这样的东西,但不是这样做会很好。当您最终陷入捕获时,您可能还希望对事务进行良好的回滚。但是,在我们解决了更紧迫的问题之后,可以进行这种清理。
如果你愿意,我会在接下来的几天里提出一个很好的教程。