What’s the difference between session.Merge and session.SaveOrUpdate?

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.

Leave a Comment