Hibernate 3.1.3 has the following buggy behaviour. If a Session.saveOrUpdate() fails, the object being saved is still marked for saving. Thus, the next time Hibernate tries to synchronize with the data store, the save will be retried and (probably) fail again. The object should not be so marked until the application elects to explicitly try to save again. This appears to be fixed in Hibernate 3.2.