<p>I notice sometimes with my parent/child objects or many-to-many relationships, I need to call either <code>SaveOrUpdate</code> or <code>Merge</code>. Usually, when I need to call <code>SaveOrUpdate</code>, the exception I get on calling <code>Merge</code> has to do with transient objects not being saved first.</p>

<p>Please explain the difference between the two.</p>

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.