Skip to content

2.8.6 NoSuchMethodException with Hibernate 5.2 #102

@coladict

Description

@coladict

Missing method:

org.hibernate.resource.transaction.spi.TransactionCoordinator.isJta()

Here's a patch to fix it that is guaranteed to be future-compatible because it asks through JPA, not the Hibernate-only APIs.

diff --git a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/PersistentCollectionSerializer.java b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/PersistentCollectionSerializer.java
index 56302b7..79866c5 100644
--- a/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/PersistentCollectionSerializer.java
+++ b/hibernate5/src/main/java/com/fasterxml/jackson/datatype/hibernate5/PersistentCollectionSerializer.java
@@ -463,12 +463,12 @@ public class PersistentCollectionSerializer
         
         public static boolean isJTA(Session session) {
             try {
-                Object transactionCoordinator = getTransactionCoordinatorMethod.invoke(session);
-                Object transactionCoordinatorBuilder = getTransactionCoordinatorBuilderMethod.invoke(transactionCoordinator);
-                return (boolean) isJtaMethod.invoke(transactionCoordinatorBuilder);
-            } catch (Exception e) {
-                // Should never happen
-                throw new RuntimeException(e);
+                EntityManager em = (EntityManager) session;
+                em.getTransaction();
+                return false;
+            } catch (IllegalStateException e) {
+                // EntityManager is required to throw an IllegalStateException if it's JTA-managed
+                return true;
             }
         }
     }

You can actually remove everything else from the SessionReader static class.

Here's the Javadoc comment from the JPA specifications.

    /**
     * Return the resource-level <code>EntityTransaction</code> object.
     * The <code>EntityTransaction</code> instance may be used serially to
     * begin and commit multiple transactions.
     * @return EntityTransaction instance
     * @throws IllegalStateException if invoked on a JTA
     *         entity manager
     */
    public EntityTransaction getTransaction();

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions