私の問題は、JPA/HibernateはentityManager.getTransaction()の呼び出しのため真を返すということです。のisActive()私は明示的にしませんでした場合でも、トランザクションを開始します(下記のコードを参照)。はなぜJPA/Hibernateのトランザクションがアクティブである1明示的
ここで問題となるのは、データベースから何かを読みたいということです。このシナリオでは、永続化されたオブジェクトが実際のコードに適合しなくなり、再計算が必要であることを示しているためです。代わりに、すぐ下には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メソッドを実装できましたが、なぜトランザクションがあるのかを理解したいと思います。助けてくれてありがとう!
あなたはこのhttp://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/transaction/support/TransactionSynchronizationManager.html#isActualTransactionActive() – karelss
を使用してトランザクションを確認できますが、悲しいことですこのプロジェクトではSpringは使用できません。 – GreenTurtle