Using merge in our service layer would allow us to get rid off NonUniqueObjectException "a different object with the same identifier value was already associated with the session." in many places without special tricks like clearing session.
The difference is that saveOrUpdate reattaches the given object to the session whereas merge returns an attached version of the given object e.g.
It'd be a significant change to the API behavior, if we decided to change save methods itself, yet it wouldn't require us to change save method signatures since they already return an attached object. The problem would only arise, if someone didn't care for the returned object and used his own object assuming it is attached.
However, we could simply add merge methods to the API. At this point we could also consider having a generic BaseOpenmrsService class that would provide us with simple CRUD (save, merge, purge, retire, getById, getByUuid) operations instead of reimplementing them all the time. It's a commonly used pattern for daos and services. An example is described here http://community.jboss.org/wiki/GenericDataAccessObjects.