NaturalIdLoadAccess not correctly working on mutable NaturalId's

Description

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.

Session.byNaturalId(declaringclass).load(...)

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.

Environment

Hibernate4.1.0, db independent (HSQLDB used in attached testcase)

Assignee

Steve Ebersole

Reporter

Guenther Demetz

Fix versions

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

Priority

Major
Configure