When we have two Entity classes with a @OneToOne relation and try to insert an instance of one entity first and then the other in another transaction, Hibernate throws an AssertionError. We use UUIDs as primary keys and an @Version field in one of the entity. And the problem seems to be related to this @Version field. If we remove it, the test passes. And the location in the Hibernate Code where the issue occurs is also related to a check that the version was properly fetched. Here is an example project that demonstrates the issue (using Kotlin): https://github.com/sconvent/hibernate-assertion-error-example The specific testcase that is failing is here: https://github.com/sconvent/hibernate-assertion-error-example/blob/main/src/test/kotlin/org/hibernate/bugs/Test.kt The reason why we're using merge() first and then persist() is that we're using Spring Data JPA and that framework will also do this under the hood. If we also use persist() for the first insert, the testcase passes. When debugging the testcase I can see that the sql statement that is executed when the error occurs is the following: select null,t1_0.id from OtherTestEntity o1_0 left join TestEntity t1_0 on o1_0.id=t1_0.other_test_id where o1_0.id=? The select null,... does not seem right and is maybe a hint on where the bug is (It is valid SQL though). Tested using Hibernate 6.2.5.Final Here’s the full stacktrace:
|