Save VS Persist

from https://hibernate.onjira.com/browse/HHH-1273
The persist() operation on Session is not cascaded at flush time. This is somewhat unexpected from a users point of view and very difficult to explain and understand (you need excellent knowledge of flushing and cascading). Reason #1 for removal. The persist() operation in general does not return a database identifier. This is surprising, as the JPA spec clearly requires a persistent instance to have a database identifier value. Since persist() makes instances persistent, it has to have the same semantics for assigning identifiers as save(). Hence, I expect that once this mismatch is resolved in the expert group, the persist() method will return a database identifier. Everything else doesn't make much sense, given the current specification and documentation. Conclusion is that persist() will have the same signature as save(). Reason #2 for removal. To document persist() properly I need a reason for its existence. Right now I'm telling readers/users to ignore it on the Session API, because it only complicates the situation with no benefit.

Update VS Merge

from http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-saveorupdate
Usually update() or saveOrUpdate() are used in the following scenario:
  • the application loads an object in the first session
  • the object is passed up to the UI tier
  • some modifications are made to the object
  • the object is passed back down to the business logic tier
  • the application persists these modifications by calling update() in a second session
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