How should the model class's equals and hashcode be implemented in Hibernate?
What are the common pitfalls?
Is the default implementation good enough for most cases?
Is there any sense in using business keys?
It seems to me that it's pretty hard to get it right to work in every situation, when lazy fetching, ID generation, proxy, etc are considered.
Hibernate has a nice and long description of when / how to override equals()
/ hashCode()
in the documentation.
The gist of it is you only need to worry about it if your entity will be part of a Set
or if you're going to be detaching/attaching its instances. The latter is not that common. The former is usually best handled via:
equals()
/ hashCode()
on a business key - e.g. a unique combination of attributes that is not going to change during the object (or, at least, session) lifetime.equals()
/ hashCode()
on the primary key IF it's set and object identity / System.identityHashCode()
otherwise. The important part here is that you need to reload your Set after the new entity has been added to it and persisted; otherwise, you may end up with strange behavior (ultimately resulting in errors and/or data corruption) because your entity may be allocated to a bucket not matching its current hashCode()
.