{"record":{"id":"7ae2f31799b28aee","repo":"quarkusio/quarkus","slug":"not-supported-for-jta-entity-managers-7ae2f3","errorCode":null,"errorMessage":"Not supported for JTA entity managers","messagePattern":"Not supported for JTA entity managers","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedStatelessSession.java","lineNumber":320,"sourceCode":"        }\n    }\n\n    @Override\n    public void insertMultiple(List<?> entities) {\n        checkBlocking();\n        try (SessionResult emr = acquireSession()) {\n            emr.statelessSession.insertMultiple(entities);\n        }\n    }\n\n    @Override\n    public boolean isOpen() {\n        return true;\n    }\n\n    @Override\n    public Transaction getTransaction() {\n        throw new IllegalStateException(\"Not supported for JTA entity managers\");\n    }\n\n    @Override\n    public HibernateCriteriaBuilder getCriteriaBuilder() {\n        checkBlocking();\n        try (SessionResult emr = acquireSession()) {\n            return emr.statelessSession.getCriteriaBuilder();\n        }\n    }\n\n    @Deprecated\n    @Override\n    public void update(Object object) {\n        checkBlocking();\n        try (SessionResult emr = acquireSession()) {\n            emr.statelessSession.update(object);\n        }\n    }","sourceCodeStart":302,"sourceCodeEnd":338,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedStatelessSession.java#L302-L338","documentation":"Quarkus Hibernate ORM uses JTA transactions, so the JPA API getTransaction() (Resource-local transactions) is unsupported and throws IllegalStateException with 'Not supported for JTA entity managers'.","triggerScenarios":"Calling session.getTransaction() (or entityManager.getTransaction()) on a transaction-scoped session, typically to call begin()/commit()/rollback() manually.","commonSituations":"Porting Spring or plain-Hibernate code that manually calls getTransaction().begin()/commit(); copying resource-local examples into a Quarkus app; trying to check transaction status via getTransaction().isActive().","solutions":["Use @Transactional for declarative transaction management","Inject jakarta.transaction.UserTransaction for programmatic begin/commit/rollback","Use Session.isJoinedToTransaction() or the CDI TransactionManager to inspect transaction state instead"],"exampleFix":"// before\nstatelessSession.getTransaction().begin(); // throws\n// after\n@Inject UserTransaction tx;\npublic void doWork() throws Exception {\n    tx.begin();\n    statelessSession.insert(entity);\n    tx.commit();\n}","handlingStrategy":"type-guard","validationCode":"// Quarkus uses JTA: never call getTransaction(); inspect via\nboolean inTx = statelessSession.isJoinedToTransaction();","typeGuard":"boolean usesResourceLocalApi(Session s) {\n    try { s.getTransaction(); return false; } catch (IllegalStateException e) { return true; }\n}","tryCatchPattern":"try {\n    session.getTransaction().begin();\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"JTA\")) {\n        tx.begin(); // UserTransaction instead\n    } else { throw e; }\n}","preventionTips":["Use @Transactional or UserTransaction, never getTransaction() in Quarkus","Search codebase for getTransaction() when migrating from Spring/plain Hibernate","Use isJoinedToTransaction() to inspect transaction state"],"tags":["jpa","jta","transactions","hibernate-orm"],"backgroundTag":"unsupported-resource-local-transaction","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}