Saltar al contenido

¿Debo escribir los métodos equals() y hashCode() en entidades JPA?

Nuestro team de expertos pasados ciertos días de investigación y recopilar de información, obtuvieron los datos necesarios, esperamos que resulte útil para ti en tu trabajo.

Solución:

No necesariamente. Hay tres opciones:

  • no anule, por lo tanto, trabajará con instancias. Esto está bien en los casos en que está trabajando con las colecciones con solo entidades que están adjuntas a la sesión (y, por lo tanto, se garantiza que son la misma instancia). Esta es (para mí) la forma preferida en muchos casos, porque requiere menos código y menos consideración al anular

  • anular hashCode() y equals() con un negocio key. Ese puede ser un subconjunto de propiedades que identifican a la entidad. Por ejemplo, para un User un buen negocio key podría ser el username o el email. Esto se considera una buena práctica.

  • anular hashCode() y equals() usando el campo ID solamente. Esto está bien en algunos casos, especialmente si tiene un identificador asignado manualmente (como un UUID). También está bien si su entidad nunca entrará en una colección. Pero para las entidades transitorias (sin identificador) que van a las colecciones, causa problemas, así que tenga cuidado con esta opción. Como señaló seanizer, debes evitarlo. En general, siempre, a menos que esté realmente consciente de lo que está haciendo (y tal vez documentándolo)

Consulte este artículo para obtener más detalles. También tenga en cuenta que equals()y hashCode() están vinculados y deben implementarse ambos con exactamente los mismos campos.

¡Si deberías!

Si no anula el valor predeterminado Java.lang.Objectequals y hashCode implementación:

@Entity(name = "Book")
public class Book implements Identifiable 
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String title;
 
    //Getters and setters omitted for brevity

la merge La operación devolverá una instancia de objeto diferente y el contrato de igualdad se romperá.

La mejor manera es usar un negocio keycomo esto:

@Entity
public class Book implements Identifiable 
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String title;
 
    @NaturalId
    private String isbn;
 
    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (!(o instanceof Book)) return false;
        Book book = (Book) o;
        return Objects.equals(getIsbn(), book.getIsbn());
    
 
    @Override
    public int hashCode() 
        return Objects.hash(getIsbn());
    
 
    //Getters and setters omitted for brevity

También puede usar el identificador para la igualdad, pero tenga en cuenta que el hashCode la implementación siempre debe devolver el mismo valor, lo que para las entidades no es realmente un problema, ya que no obtiene muchas entidades por transacción de base de datos, ya que, de lo contrario, el costo de obtener datos es mucho mayor que el de un solo depósito. HashMap pena impuesta mediante el uso de un fijo hashCode:

@Entity
public class Book implements Identifiable 
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String title;
 
    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (!(o instanceof Book)) return false;
        Book book = (Book) o;
        return Objects.equals(getId(), book.getId());
    
 
    @Override
    public int hashCode() 
        return getClass().hashCode();
    
 
    //Getters and setters omitted for brevity

Sí, debe definir correspondiente equals() y hashcode() métodos, pero NUNCA debe permitir que la identificación sea parte de ninguno de los dos. (Vea esta respuesta mía reciente en una pregunta similar)

Si te ha resultado de ayuda este post, te agradeceríamos que lo compartas con más seniors así contrubuyes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *