我的问题是JPA/Hibernate在调用entityManager时返回true。getTransaction()。isActive(),即使我没有显式启动事务(请参阅下面的代码)。
这里的问题是,我想从数据库中读取一些内容,在这种情况下,SerializationException是可以的,因为这只是表明持久化对象不再适合实际代码,需要重新计算。下面的代码不只是返回null,而是引发以下异常:
Transaction rollback failed.
org.hibernate.TransactionException: Unable to rollback against JDBC Connection
这向我表明,一定有一个我在代码中没有启动的事务。上面代码中的最后一个块是
final EntityManager entityManager = Persistence.createEntityManagerFactory("test").createEntityManager();
try {
final TypedQuery<Test> query = entityManager.createQuery("SELECT t FROM test t", Test.class);
return query.getResultList();
} catch (final PersistenceException e) {
if (e.getCause() instanceof SerializationException) {
LOG.debug("Implementation changed meanwhile. That's ok - we return null.");
return null;
}
throw e;
} finally {
EntityManagerCloser.closeEntityManager(entityManager);
}
EntityManagerCloser如下所示:
public final class EntityManagerCloser {
private static final Logger LOG = LoggerFactory.getLogger(EntityManagerCloser.class);
public static void closeEntityManager(EntityManager entityManager) {
if (entityManager.getTransaction().isActive()) {
try {
entityManager.getTransaction().rollback();
} catch (PersistenceException | IllegalStateException e) {
LOG.error("Transaction rollback failed.", e);
}
}
if (entityManager.isOpen()) {
try {
entityManager.close();
} catch (IllegalStateException e) {
LOG.error("Closing entity manager failed.", e);
}
}
}
}
Hibernate docs表示“始终使用明确的事务边界,即使对于只读操作也是如此”。那么我真的需要插入一个
entityManager.getTransaction().begin();
....
<do read here>
....
entityManager.getTransaction().commit();
在我对数据库执行的每个读取操作周围?
我可以为没有回滚事务块的只读操作实现另一种closeEntityManager方法,但我想了解为什么会有事务。谢谢你的帮助!
多亏了Jobin,我很快找到了解决问题的方法:
我想我需要调用entityManager.isJoinedToTransaction()
在我的CloseEntityManager方法之前调用entityManager.getTransaction(). isActive()
。
这将防止EntityManagerCston启动它自己的事务,我以后不能回滚,因为我没有显式调用transaction.begin()
。
问题是,当您调用entityManager时。getTransaction() 将创建一个新的事务对象。因此,最好将事务引用保存到变量,如下所示。
Transaction txn = entityManager.getTransaction();
if (txn.isActive()) {
try {
txn.rollback();
} catch (PersistenceException | IllegalStateException e) {
LOG.error("Transaction rollback failed.", e);
}
}
问题涉及的方法是: 编辑。以下是完整的堆栈跟踪(一些消息是西班牙语的):
我有一个带有唯一约束的字段'nom'的表,当我测试插入表中已经存在的该字段的值时,会抛出org.hibernate.exception.ConstraintViolationExcure。然后在我坚持之后,我得到了一个事务已经活动的异常。 这是我在Dao类中的持久化方法 这里是我捕获异常的代码 如何解决此事务问题?
问题内容: 我正在通过遵循一个教程来研究示例Spring Hibernate示例,并且陷入了异常说 这是我的代码: Person.java- 简单的POJO person.hbm.xml- 映射文件 PersonDao.java- 我的DAO类 PersonService.java- 服务层 spring-config.xml -Spring配置文件: 最后是我的 主程序-MainApp.java
我有这个类,它致力于通过hibernate的持久层将数据持久化。 问题是它不持久化数据。 堆栈是: 但我必须注意的是,它在其他课堂上效果很好。 更新: 当我打印tx.isActive()时,它给我提供了false。 更新 我试图获取有关错误的更多信息: 我找到了问题所在: 事实上,表tlinkEquipment在同一个表中有2个fk,我保存了TEquipements的数据,然后保存了TEquipe
如何启动线程: 我调用关闭线程:
任何人/导师/古鲁可以帮助我解决这个问题?我被困在它超过2天Java代码通过注释 我得到了这个错误中 支柱2.3.15 请参见以下详细错误: 堆栈跟踪: : DAO层: 服务层返回: 服务层前端: 动作-回: 行动-前沿: 所有接口: :