1. After updating the value of a mutable NaturalId, the entity object can be retrieved with the new value, but also with the old value.
assertNotSame(session.bySimpleNaturalId(C.class).load("1"), session.bySimpleNaturalId(C.class).load("3")); --> failing
Cause: On deletions the internal NaturalId cache get synchronized properly, but not on modifications (no synchronization provided at all)
2. When inserting or deleting an entity object, the entity-persister of the object's concrete class is considered as cache-region.
When loading an entity object by NaturalId, indeed the entity-persister of the declaring class is considered as cache-region.
As declaringclass may be the superclass of a concrete subclass,
the NaturalId-synchronisation (currently called only on deletions) does synchronize the wrong cache-region.
(it tries to remove the entry in the cache-region of the subclass-persister,
but the entry is actually cached in the cache-region of the superclass persister)
N.B: This issue has nothing to do with spreading @NaturalId across an entity hierarchy (HHH-7129),
in attached testcase the NaturalId is declared exclusively in the root class.
Attached testcase demonstrates both bugs.
Hibernate4.1.0, db independent (HSQLDB used in attached testcase)