2009-12-18 24 views
6

He estado tratando de razonar sobre la mejor manera de manejar si generalmente es una buena práctica implementar hashcode y es igual a entidades (quiero decir entidad en el sentido general pero en la mayoría de los casos será una entidad JPA).Para iguales y hashcode o no en clases de entidad, esa es la pregunta

En el capítulo 24 del manual de hibernación http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html dice esto ...

identificar las claves naturales para todas las entidades , y asignarlos usando . Implemente equals() y hashCode() para comparar las propiedades que componen la clave natural.

Tiene sentido que los .equals y .hashcode incluyan solo estas claves naturales, pero ¿qué ocurre si tiene más de una instancia de la misma entidad (el mismo id natural y el mismo hashcode)? Parece que esta práctica podría tener implicaciones sutiles en otras partes de su aplicación. ¿Alguien ha intentado esto antes a gran escala?

Respuesta

3

Hay ocasiones en las que desea que Equals compare todas las propiedades y momentos en los que desea que Equals sea solo la clave. Hemos tenido mucho más éxito utilizando clases de ayuda que son explícitas, por lo que no hay ambigüedad en cuanto a lo que se compara.

ByKeyComparer.Equals... 
ByPropertiesComparer.Equals... 

o

Entity1.EqualsByKey... 
Entity1.EqualsByProperties... 
+1

¿Qué sentido tiene que ser igual por la clave pero no es igual por las propiedades? Es como ser igual por referencia pero no por valor. –

+3

nuevas entidades no tendrán una clave principal (si está utilizando sustitutos, que es la forma estándar). Entonces, los iguales no funcionarían para entidades nuevas si está usando la clave para comparar. –

+0

qué método usas para las clases persistentes 'equals()' y 'hashcode()' métodos entonces? Debe hacerse una elección para estos ya que serán invocados por el código Collection o Hibernate. –

6

Lo he intentado antes a gran escala (o al menos en una aplicación que usa mucho hibernación). Es una buena idea.

Tiene sentido que los .equals y .hashcode incluyan solo estas claves naturales, pero ¿qué ocurre si tiene más de una instancia de la misma entidad (el mismo id natural y el mismo hashcode)? Parece que esta práctica podría tener sutiles implicaciones en otros lugares de su aplicación.

Esto es lo que significa. Por lo general, quiere instancias múltiples de la misma entidad para tener éxito al comparar .equals, y sí, tiene implicaciones en otros lugares. IMO esas implicaciones son que las cosas funcionarían como se esperaba.

Cuestiones relacionadas