Issues

Select view

Select search mode

 
50 of 52

Hibernate increases version on read

Rejected

Description

On a special constellation hibernate increases the internal used version of an entity on a read operation. For example if you save an entity the version is initial set. If you execute a query to read the entity afterwards, the version increases on this read. Please notice that the entity has NOT changed in the meantime. An update of the version must not happen here.

This problem seems to occur only if you have a few prequisites:
1. An entity, which has a component or subclasses
2. The component/subclasses must use an custom usertype
3. The read operation is covered by transaction

The bug leads to StaleObjectStateExceptions in production because the version has changed after a read operation by another thread.

An example is attached.

Attachments

1
  • 25 Jan 2011, 08:43 AM
Created January 25, 2011 at 8:43 AM
Updated March 7, 2014 at 5:31 PM
Resolved May 20, 2011 at 7:30 AM

Activity

Brett MeyerMarch 7, 2014 at 5:31 PM

Bulk closing rejected tickets in "resolved" state.

Strong LiuMay 20, 2011 at 7:30 AM

it is not a bug, this is caused by your own custom type impl.
hibernate use equals to check if a property is changed (aka dirty).
in your test, the MyComponent#type is null, and with your ShortEnumUserType#equals, it returns false if the type is null,
so, you actually tell hibernate if the type is null, then the managed entity is dirty, that's why hibernate schedule a update.

@Override public boolean equals(final Object x, final Object y) { if ( x == null || y == null ) { return false; } return x.equals( y ); }

add

if(x==y)return true;

Flag notifications