During a migration from H5 to H6 with the Keycloak project, I found a change in the behavior how attribute converters are handled. It seems that a property which results from an attribute converter must not be changed / are assumed to be immutable, as they are not be found by H6 dirty checking. Our example:
- Read an entity from the DB where property is converted from JSON to a HashMap
- Modify the contents of the HashMap
- While H5 marks the entity as dirty and writes it to the DB, H6 doesn't recognize it as dirty, and doesn't write it to the database.
The workaround is to first clone the map for the attribute before modifying it. Then dirty tracking works as before. Another possible workaround is to add a @Mutability(...) to the field. Here's a reproducer example: https://github.com/hibernate/hibernate-test-case-templates/compare/main...ahus1:hibernate-test-case-templates:is-HHH-xxxx-attribute-converter-dirty-checking?expand=1 In the Zulip Chat Gavin King suggested that Hibernate might default to non-mutable properties for converted attributes by default: https://hibernate.zulipchat.com/#narrow/stream/132096-hibernate-user/topic/H5-.3EH6.3A.20Attribute.20Converter.20results.20need.20to.20be.20immutable.3F |