JPA / Hibernate: Quoi de mieux pour les clés primaires composites, les implémentations @IdClass ou @EmbeddedId et pourquoi?

quoi de mieux pour les clés primaires composites JPA/Hibernate, les implémentations @IdClass ou @EmbeddedId et pourquoi?

c'est une question intentionnellement naïve. J'ai décidé d'utiliser @EmbeddedId (pour quelque raison que ce soit) et j'ai l'impression d'avoir fait le mauvais choix. Dereferencing le embeddedId qui contient les propriétés de la colonne est redondant et assez sujet aux erreurs lors du codage.

y a-t-il d'autres raisons pour et/ou contre l'autre? Est l'un recommandation de L'app (spec)?

24
demandé sur Kawu 2010-10-26 18:37:25

3 réponses

tout d'abord, si possible, éviter les identifiants composites à tout prix. Mais si vous en avez vraiment besoin, je vous recommande @EmbeddedId .

@IdClass est essentiellement un reliquat d'EJB 2.1 fois pour faciliter la migration à partir de BMP. Dans quelques rares cas particuliers, il peut être mieux que @EmbeddedId . Cependant, généralement @EmbeddedId est meilleur et plus OO car il encapsule le concept os la clé beaucoup mieux dans l'objet.

vous pouvez utiliser @AttributeOverride(s) si vous avez besoin dans le champ Clé.

Je ne vois pas pourquoi vous pensez que le déréférencement de l'id intégré est redondant et sujet à des erreurs.

8
répondu Victor Stafusa 2017-08-02 15:03:29

comme Pascal a écrit une partie de la réponse:

quelle annotation dois-je utiliser: @IdClass ou @EmbeddedId

à la fin, je crois que l'utilisation de @IdClass est beaucoup plus facile dans la pratique, parce que vous devez ajouter le nom de propriété embeddedId aux propriétés de dereference PK, alors que celles-ci ne sont pas écrites pour toutes les propriétés non-PK.

vous devez toujours vous rappeler exactement quelles propriétés font partie d'un PK et ceux qui ne le sont pas. Cela complique inutilement l'écriture des requêtes JPQL.

en outre, AFAIK la spécification JPA 2.0 vous permet de mettre @Id sur @XToX / @JoinColumn /s propriétés et il introduit le @MapsId annotation, de sorte que la cartographie des relations d'identification (A. K. A. les identificateurs dérivés dans le JPA) sont plus naturels à mettre en œuvre.

7
répondu Kawu 2017-05-23 12:17:14

I. rappelez-vous utiliser idclass pour le faire. Mais je vous recommande de faire tout ce que vous pouvez pour éviter les touches Multi-champs. Ils créent juste du travail supplémentaire.

2
répondu drekka 2010-12-10 00:36:10