Hibernate “Transaction already active” behaviour with custom transaction manager

Description

While migrating from Hibernate 4.x to latest Hibernate 5 version, I'm encountering an issue with regards to transaction management.

In our code (actually a unit test), there is a transaction manager that begins a JTA transaction, followed by a sequence of multiple invocations of a method that call to creates a Session to do a save (in which a beginTransaction() is done). Below is an example that reproduces the issue (the scenario is not using Spring or any other container managed transaction management):

This is causing an IllegalStateException to be thrown with the message "Transaction already active". This behavior seems to have been introduced in Hibernate 5.2.0 (this is the commit) to comply with JPA's EntityTransaction. Previously, Hibernate just ignored the beginning the physical transaction itself because it knows an enclosing transaction is present: it just creates a wrapper JtaTransaction with isInitiator set to false.

This exception is thrown in org.hibernate.engine.transaction.internal.TransactionImpl, specifically the begin() method:

This contradicts with the user manual, where it says the below:

Is there a way to restore the old behavior? Our code relies on such a custom TM scenario. It would be great to have your feedback on this.

Environment

None

Status

Assignee

Andrea Boriero

Reporter

Mahmoud Anouti

Fix versions

Labels

None

backPortable

Backport?

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Worked in

4.2.2
4.3.11
5.1.16

Components

Affects versions

Priority

Major
Configure