¿Se puede usar un método de la class de datos Kotlin equals () sin más modificaciones junto con JPA?

Kotlin tiene una class de datos que viene con toString(), equals(), hashCode(), and copy() .

¿ equals() and hashCode() pueden usar " equals() and hashCode() " sin más ajustes para las classs de JPA? Por lo general, tenemos que pasar mucho time leyendo sobre "Claves naturales", el ciclo de vida del context de persistencia, etc. en artículos vinculados a continuación antes de sentirnos seguros de que estamos haciendo lo correcto:

  • Equals y Hashcode
  • the-jpa-hashcode-igual-dilema

¿Podemos simplemente confiar en las implementaciones de Kotlin equals() and hashcode() ahora?

En mi opinión, las classs de datos en Kotlin no deberían usarse a less que realmente entiendas lo que estás haciendo.

Reemplazar equals / hashCode en datos mutables puede causar un problema. Considere que ha agregado una instancia de una class mutable a HashSet , y luego ha cambiado algunas properties de esa instancia. Esto afecta el valor devuelto por hashCode .

A su vez, esto hace que HashSet pueda encontrar la instancia, ya que la searchá en una input de hashtable completamente diferente. ¡No podrás eliminar esta instancia de HashSet !

Buenos ejemplos de candidatos para ser classs de datos en kotlin son: numbers complejos, vectores de tamaño constante. Los malos ejemplos son: entidades JPA, DTOs.

En cuanto a JPA, estos artículos son obstinados. Hay otra opinión: no debe anular en absoluto los equals y hashCode para las entidades JPA.

Justificación: los proveedores de JPA (Hibernate, EclipseLink) deben garantizar que a === b iff a y b tienen la misma key primaria en la tabla, y tanto a como b están en estado persistente. Este contrato puede ser roto para entidades separadas. Pero, en mi opinión, trabajar con entidades separadas es una mala práctica que uno debería evitar. Lo único que puede tener sentido es almacenar entidades separadas para fusionarlas en otra transacción JPA.

Las entidades JPA deben depender de la identidad del object, no de que las keys primarias sean iguales, eso es aproximadamente el 90% de lo que se trata el mapeo relacional de objects. Tener una implementación de JPA salta a través de todo tipo de loops para crear, mantener y propagar el map de identidad y luego ignorarlo podría ser una señal de que no necesita JPA en absoluto, y causará problemas. Especialmente si no estás al 100% consciente de lo que estás haciendo.

Dicho esto, probablemente pueda usar classs de datos de Kotlin en muchos casos, siempre que:

  • no almacena objects persistentes en maps y sets
  • mantienes el constructor pnetworkingeterminado y no tratas de tocar la initialization de objects de ninguna manera (proporcionando valores pnetworkingeterminados, etc.)
  • Kotlin se establece en nulo si no es nulo
  • ¿Es una buena práctica usar la function de ejecución en lugar de devolver en Kotlin?
  • ¿Forma idiomática de transformar el map en kotlin?
  • ¿Cómo se pueden combinar las opciones de partido en Kotlin?
  • Clase no encontrada en el module
  • Repetir y crear una database desde el volcado sql: cómo hacerlo?
  • Usa las librerías de Javascript en Kotlin
  • serializar con gson y volver no funciona con types generics
  • Kotlin Propiedad Genérica
  • Error de inyección de Kotlin dagger 2 Android ViewModel
  • ¿Hay alguna manera de orderar las keys groupBy en rx-java / kotlin?