I feel your pain, we have had a lot of those issues as well. Maybe it is an application design floor on our part. Apples and Oranges.
It seems like Hibernate uses == to compare object references instead of equals() to compare object contents.
I wrote a little utility to scan an object graph and look for objects with different references, but are equal using equals() and pick one of n of those instances and do a reassign through the entire object graph so that only one unique instance exists. So before I do any save/saveOrUpdate I run this utility to update references. It takes around 40/50 ms for the first round and thereafter I get mostly 0-15 ms for the update to complete.
This does require your object to define it's own equals() method though.
Anyway this sorts out this nasty exception. If you want the source my mail is
ri.so@webmail.co.za