Il y a eu quelques discussions ici sur des entités JPA et qui hashCode()
/equals()
mise en œuvre devrait être utilisé pour les classes d'entité JPA. La plupart (si pas tous) d'entre eux dépendent de mise en veille prolongée, mais j'aimerais en discuter JPA-mise en œuvre-neutre (je suis en utilisant EclipseLink, par la voie).
Toutes les implémentations possibles sont d'avoir leurs propres avantages et inconvénients concernant:
-
hashCode()
/equals()
contrat de la conformité (immuabilité)List
/Set
opérations - Si l' identique des objets (par exemple à partir de différentes sessions, des proxies dynamiques de paresseusement-chargé de structures de données) peuvent être détectés
- Si les entités se comportent correctement dans détaché (ou non persistantes) état
Aussi loin que je peux voir, il y a trois options:
- Ne pas les remplacer; s'appuyer sur
Object.equals()
etObject.hashCode()
-
hashCode()
/equals()
de travail - impossible d'identifier des objets identiques, les problèmes avec des proxies dynamiques
- pas de problèmes avec du recul des entités
-
- Remplacer, à partir de la clé primaire
-
hashCode()
/equals()
sont cassés - identité correcte (pour toutes les entités gérées)
- problèmes avec du recul des entités
-
- De les remplacer, basée sur le Business-Id (non champs de clé primaire; ce sur les clés étrangères?)
-
hashCode()
/equals()
sont cassés - identité correcte (pour toutes les entités gérées)
- pas de problèmes avec du recul des entités
-
Mes questions sont les suivantes:
- Ai-je raté une option et/ou pro/con?
- Quelle option avez-vous choisi et pourquoi?
Mise à JOUR 1:
Par "hashCode()
/equals()
sont cassé", je veux dire qu'successives hashCode()
invocations peuvent renvoyer des valeurs différentes, ce qui est (lorsqu'il est correctement mis en œuvre) ne se décompose pas dans le sens de l' Object
documentation de l'API, mais qui pose des problèmes lorsque vous essayez de récupérer un changement de l'entité à partir d'un Map
, Set
ou à d'autres à base de hachage Collection
. Par conséquent, les implémentations JPA (au moins EclipseLink) ne fonctionnera pas correctement dans certains cas.
Mise à JOUR 2:
Merci pour vos réponses -- la plupart d'entre eux ont une qualité remarquable.
Malheureusement, je suis toujours pas sûr de l'approche qui sera le meilleur pour une vraie vie de l'application, ou la façon de déterminer la meilleure approche pour mon application. Donc, je vais garder ouverte la question et d'espoir pour certains plus de discussions et/ou des opinions.