You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Adam Henderson <ad...@azudio.co.uk> on 2005/04/22 17:05:42 UTC
Tapestry Hibernate NonUniqueException
Having a problem with a NonUniqueException
In my application I need to display, add & update Thing objects in
various places, so I've created a ThingForm component that I can simply
drop in and pass in the required parameters and it should work.
Page Description
A page displays some info about the ParentThing and also presents a
form to add another Thing to its set of Things, once submitted the page
displays again with the filled in information still there so the user
can make ammendments to the Thing and submit again.
Domain Classes
ParentThing - An object that contains many Thing objects
ParentThingManager - A service object which handles the crud operations
for ParentThings
Thing - An object that is associated to a ParentThing
ParentThing 1---M Thing (Cascade="save-update")
Tapestry Component
ThingFormComponent - A common form used in my application to add & edit
Thing objects
Parameters
ThingManager - A Service Manager that handles the saving of the Thing
object using Spring/HibernateDAOs
ParentThing - An object that is contains many Thing objects as a Set
[Thing] - An optional Thing object to pass into the component &
therefore display field values
Page Flow
In my page spec a property is defined to create a ParentThingManager
The id of the ParentThing is in my visit object, so in pageBeginRender
I have code that retrieves my ParentThing from the DB (using
ParentThingManager (Spring/Hibernate DAO)) and then calls
setParentThing(pt) property on my page.
The template contains: <span jwcid="@ThingFormComponent"
manager="ognl:thingManager" thing="ognl:thing">
My ThingFormComponent pageBeginRender() method creates an empty Thing
object if necessary.
User fills out the form and submits
This then calls save() listener which does the following:
// Set the associations on both sides for Hibernate
getThing().setParentThing(getParentThing());
getParentThing().getThings().add(getThing());
getParentThingManager().saveParentThing(getParentThing());
return;
The Thing is added to the ParentThing & saved to the DB correctly
The page redisplays with all the fields filled out, user resubmits but
this throws a hibernate NonUniqueObjectException "a different object
with the same identifier value was already associated with the session:
22, of class: com.company.Thing"
Now I get why this is happening (I think) - because on submission the
ParentThing is retrieved therefore bring back "Thing:22" as part of its
Set of Things so "Thing:22" now exits in the hib session, I then
re-insert the Thing from the form which also has the id of 22 and
hibernate realises that the Thing:22 in its session is different to the
new one and throws a wobbly (exception).
So how do I get round this?, I'd like it to do a saveOrUpdateCopy() on
its child Things when it does its cascade
Am I correct in my thinking and how do I get round this.
Will post to the hibernate forum as well.
Many thanks,
Adam
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org