我有一张桌子上的字段' nom'使用唯一约束,当我测试插入表中已存在的该字段的值时,抛出 org.hibernate.exception.ConstraintViolationException 。然后在我坚持不懈之后,我得到一个交易已经激活例外。
这是我在Dao课程中坚持不懈的方法
public void persist(E entity) throws Exception {
EntityTransaction tr=entityManager.getTransaction() ;
tr.begin();
entityManager.persist(entity);
tr.commit();
}
这里是我捕获异常的代码
try {
rd.persist(r);
} catch (Exception e) {
e.printStackTrace();
}
如何解决此交易问题?
答案 0 :(得分:3)
您可以允许框架处理事务(而不是在春天,您可以使用@transactional),而不是显式打开事务。但如果不是它看起来代码有一个开始和提交以防它成功,尝试使用finally在persist方法中添加tr.rollback()(或者你甚至可以使用tr检查事务是否仍处于活动状态.isActive()方法。
答案 1 :(得分:1)
没有必要对Transaction做任何事情,因为它是由Spring处理的。
我遇到了#34;交易已经活跃"。虽然我认为导致它的原因与你的问题有所不同,但我认为我的答案应该对某人有帮助。
例如:
// Transaction handled by Spring
Session session = sessionFactory.getCurrentSession();
...
return;
------------------------------------------------------------
// Transaction handled by yourself
Session session = sessionFactory.openSession();
Transcation tr = session.beginTransaction();
...
tr.commit();
session.close();
return;