Optimistic lock - Delete [message #799970] |
Thu, 16 February 2012 09:17  |
Eclipse User |
|
|
|
I'm implementing optimistick lock in an entity.
When two users select at same time the same object, and both try to remove it, the first one succeeds and the second instead of getting an OptimisticLockException gets the following exception:
Caused by:(4) java.lang.NullPointerException null
at org.eclipse.persistence.internal.descriptors.PersistenceObjectAttributeAccessor.getAttributeValueFromObject(PersistenceObjectAttributeAccessor.java:30)
at org.eclipse.persistence.mappings.DatabaseMapping.getAttributeValueFromObject(DatabaseMapping.java:497)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.getBaseValueForField(ObjectBuilder.java:2358)
at org.eclipse.persistence.descriptors.VersionLockingPolicy.lockValueFromObject(VersionLockingPolicy.java:514)
at org.eclipse.persistence.descriptors.VersionLockingPolicy.addLockValuesToTranslationRow(VersionLockingPolicy.java:105)
... (25 lines)
at $Proxy183.flush(Unknown Source)
at mypackage.MyUtilClass.remove(MyUtilClass.java:107)
The implementation of method remove is like that
public void remove(TED entity) {
Object key = getKey(entity);
try {
TED entityFind = (TED) em.getReference(entity.getClass(), key);
if (entityFind == null) {
throw new RecordNotFoundException(msg);
}
em.remove(entityFind);
em.flush();
} catch (EntityNotFoundException e) {
throw new RecordNotFoundException(msg);
}
}
I would expect an EntityNotFoudException, OptimiscticLockException or return null from em.getReference. But not a NullPointerException throwed by em.flush method.
Is there an explanation? should I catch a nullpointerexception?
Thanks. Mauro.
|
|
|
Re: Optimistic lock - Delete [message #800148 is a reply to message #799970] |
Thu, 16 February 2012 14:02  |
Eclipse User |
|
|
|
You should be getting EntityNotFoundException (or optimisticLockException if it was loaded/fetched already) instead of an NPE, so this is a bug. Please file a bug with the entity that can reliably reproduce the error, the full stacktrace and any settings used.
How was the version field mapped? I ran into various other problems using getReference when the object wasn't in the cache already, but not an NPE.
The only absolute workaround I can think of is to use find instead of getReference since it will ensure the object is there for the remove call. This should work similar to what the provider will likely need to do, since it will need to trigger the entity into the cache anyway to get the version field for the delete. The only difference is you might also get exceptions on the find call.
Best Regards,
Chris
|
|
|
Powered by
FUDForum. Page generated in 0.06651 seconds