
|
If you were logged in you would be able to see more operations.
|
|
|
Seam
Created: 17/Dec/07 08:41 AM
Updated: 16/May/08 06:35 AM
|
|
| Component/s: |
Core
|
| Affects Version/s: |
None
|
| Fix Version/s: |
The future
|
|
|
Original Estimate:
|
Unknown
|
Remaining Estimate:
|
Unknown
|
Time Spent:
|
Unknown
|
|
|
My entity had a version property:
@Version
@Column(name = "OBJ_VERSION", nullable = false)
protected Integer version;
In a very involved ajax reRender/conversation situation I sometimes got the following exception from HibernatePersistenceProvider:
public static void checkVersion(Object value, Session session, Object oldVersion, Object version)
{
ClassMetadata classMetadata = getClassMetadata(value, session);
VersionType versionType = (VersionType) classMetadata.getPropertyTypes()[ classMetadata.getVersionProperty() ];
if ( !versionType.isEqual(oldVersion, version) )
{
throw new StaleStateException("current database version number does not match passivated version number");
}
}
This failed because oldVersion was 'null' and version was '0'.
Hibernate returned '0' from ClassMetaData.getVersion(), it looks like it can't return null, from Javadoc: Get the version number (or timestamp) from the object's version property (or return null if not versioned).
We should do a null check before asking Hibernate.
Workaround: Use primitive for version field in entity or initialize it to '0'.
|
|
Description
|
My entity had a version property:
@Version
@Column(name = "OBJ_VERSION", nullable = false)
protected Integer version;
In a very involved ajax reRender/conversation situation I sometimes got the following exception from HibernatePersistenceProvider:
public static void checkVersion(Object value, Session session, Object oldVersion, Object version)
{
ClassMetadata classMetadata = getClassMetadata(value, session);
VersionType versionType = (VersionType) classMetadata.getPropertyTypes()[ classMetadata.getVersionProperty() ];
if ( !versionType.isEqual(oldVersion, version) )
{
throw new StaleStateException("current database version number does not match passivated version number");
}
}
This failed because oldVersion was 'null' and version was '0'.
Hibernate returned '0' from ClassMetaData.getVersion(), it looks like it can't return null, from Javadoc: Get the version number (or timestamp) from the object's version property (or return null if not versioned).
We should do a null check before asking Hibernate.
Workaround: Use primitive for version field in entity or initialize it to '0'.
|
Show » |
|
|
"Declaring a nullable version or timestamp property is an easy way to avoid any problems with transitive reattachment in Hibernate, especially useful for people using assigned identifiers or composite keys!"