From the article, the "before" version of the hbm.xml file contained this:
<id name="id" column="ID"
<version name="version" column="VERSION" />
while the "after" version contained this:
<id name="id" column="ID">
<generator class="assigned" />
<version name="version" column="VERSION"
So there were two changes: (1) the internally-generated id value was used instead of the Hibernate-generated id; and (2) the "unsaved indicator" was moved from id to version. Here is a snippet from the Hibernate manual:
184.108.40.206. Assigned identifiers
If you want the application to assign identifiers, as opposed to having Hibernate generate them, you can use the assigned generator. This special generator uses the identifier value already assigned to the object's identifier property. The generator is used when the primary key is a natural key instead of a surrogate key. This is the default behavior if you do not specify a <generator> element. The assigned generator makes Hibernate use unsaved-value="undefined". This forces Hibernate to go to the database to determine if an instance is transient or detached, unless there is a version or timestamp property, or you define Interceptor.isUnsaved().
So unless we have a version/timestamp property to use as the unsaved indicator (as I suggested re Web Services), we are going to take a performance hit.
Re OpenmrsObjectSaveHandler, I would say we delete it. What is gained by keeping zombie code that executes without ever doing anything useful?