views:

11441

answers:

3

I noticed sometimes with my parent/child objects, or many-to-many relationships, I need to call either SaveOrUpdate, or Merge. Usually, when I need to call SaveOrUpdate, the exception I get on calling Merge has to do with transient objects not being saved first... Please explain the difference between the two.

+34  A: 

This is from section 10.7. Automatic state detection of the Hibernate Reference Documentation:

saveOrUpdate() does the following:

  • if the object is already persistent in this session, do nothing
  • if another object associated with the session has the same identifier, throw an exception
  • if the object has no identifier property, save() it
  • if the object's identifier has the value assigned to a newly instantiated object, save() it
  • if the object is versioned (by a <version> or <timestamp>), and the version property value is the same value assigned to a newly instantiated object, save() it
  • otherwise update() the object

and merge() is very different:

  • if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance
  • if there is no persistent instance currently associated with the session, try to load it from the database, or create a new persistent instance
  • the persistent instance is returned
  • the given instance does not become associated with the session, it remains detached

You should use Merge() if you are trying to update objects that were at one point detached from the session, especially if there might be persistent instances of those objects currently associated with the session. Otherwise, using SaveOrUpdate() in that case would result in an exception.

David Crow
Thank you. Essentially I was looking for that reference documentation, I googled it for a while and couldn't find it! Thanks!
EvilSyn
good answer... I wonder - if I use merge on a new entity is there any reason to use save afterwords or I can assume merge has created the new entity in the DB for sure ? (and if it's an detached entity, once merge is the changes omitted to the DB automatically ?)
Dani
Are you sure about this? Looking at the NHiberante source SaveOrUpdateCopy triggers a Merge event with the same parameters as the Merge function. I think the they are identical, the SaveOrUpdateCopy function is something that has existed in hibernate/nhibernate since 1.0 the Merge function is new and was added to to hibernate to conform to a new java standard (I think)
Torkel
A: 

As I understand it, Merge will take an object that may not be associated with the current session, and copy its state (property values, etc.) to an object that is associated with the current session (with the same PK value/identifier, of course).

SaveOrUpdate will call Save or Update on your session, based on a given object's identity value.

Ryan Duffield
A: 

SaveOrUpdate() can be used to convert transient object to persistent object.then where should we use Merge()? only when, where the object has been detatched once and now again in session.

Please make me understand?i am confused!!