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()
yequals()
con un negocio key. Ese puede ser un subconjunto de propiedades que identifican a la entidad. Por ejemplo, para unUser
un buen negocio key podría ser elusername
o elemail
. Esto se considera una buena práctica. -
anular
hashCode()
yequals()
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.Object
equals
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.