In our application we have a Hibernate interceptor which may revert all changes made to an entity in the onFlushDirty() method, based on various conditions. After doing so, our onFlushDirty() implementation returns true indicating that the currentState array has changed.
It works as expected in most cases but we experience the following if
all property values are reverted:
- the entity is not updated in the database - as expected
- the version number of the entity is still incremented - this seems strange because the database and the entity will not be in sync after flush
I investigated the problem and found the following code in DefaultFlushEntityEventListener.isVersionIncrementRequired():
Code:
private boolean isVersionIncrementRequired(
FlushEntityEvent event,
EntityEntry entry,
EntityPersister persister,
int[] dirtyProperties
) {
final boolean isVersionIncrementRequired = entry.getStatus()!=Status.DELETED && (
dirtyProperties==null ||
Versioning.isVersionIncrementRequired(
dirtyProperties,
event.hasDirtyCollection(),
persister.getPropertyVersionability()
)
);
return isVersionIncrementRequired;
}
In our case dirtyProperties is null (because all dirty properties were reverted by the interceptor), so isVersionIncrementRequired() will return true.
It means that the version is incremented even if no properties were changed and no database update is performed when flushing.
What do you think, is this the expected behaviour?
We use 3.6.0-Final.
Thanks for your help in advance!
Norbi