Jun 02 2008

NonUniqueObjectException

Tag: Hibernate, JavaSatya @ 9:34 am

I got the following exception using RAD 7.0 and WAS 6.1 with Hibernate:
Randomly we come across scenarios where we get a NonUniqueObjectException. It occurs during updates and inserts.

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [uk.co.argos.puma.persistence.pojo.Page#6494]

at org.hibernate.engine.PersistenceContext.checkUniqueness
(PersistenceContext.java:586)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate
(DefaultSaveOrUpdateEventListener.java:254)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached
(DefaultSaveOrUpdateEventListener.java:214)

at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate
(DefaultUpdateEventListener.java:33)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate
(DefaultSaveOrUpdateEventListener.java:69)

at org.hibernate.impl.SessionImpl.update(SessionImpl.java:495)

at org.hibernate.impl.SessionImpl.update(SessionImpl.java:486)

----------------------------------------------------------------------------------------

SOLUTION : -

Hibernate provides various options for Transaction management-

1. ThreadLocal - transactions associated with the life of calling thread.

2. JTA- Hibernate will Use JTA for Transaction Management.

3. Container managed transactions- Hibernate will hook itself to the application servers transaction context (Best Approach).

NonUniqueObjectException occurs when we are trying to attach a detached instance to hibernate sesion which is already loaded in hibernate session.
So in such scenarios, we should use session.merge() instead of session.persist() as
Session.merge() will do a double check for any loaded instance and will try to synchronize the detached instance with persisted instance.


May 27 2008

getting a PropertyAccessException?

Tag: Hibernate, JavaYogesh @ 11:37 am

org.hibernate.PropertyAccessException: Null value was assigned to a property of
primitive type setter of XXXXXX

Hibernate internally treats every attribute in VO as OBJECT.

Instead of using primitives directly use the respective wrapper class objects.

example:
instead of using
private int versionNo;
in your VO, use
private java.lang.Integer versionNo;