JPA: différence entre @JoinColumn et @PrimaryKeyJoinColumn?

Quelle est la différence exacte entre @JoinColumn et @PrimaryKeyJoinColumn ?

Vous utilisez @JoinColumn pour les colonnes faisant partie d’une clé étrangère. Une colonne typique pourrait ressembler à (par exemple dans une table de jointure avec des atsortingbuts supplémentaires):

 @ManyToOne @JoinColumn(name = "...") private OtherClass oc; 

Que se passe-t-il si je fais la promotion de la colonne pour être un / le PK (relation identificasortingce aka)? Comme la colonne est maintenant la PK, je dois la marquer avec @Id :

 @Id @ManyToOne @JoinColumn(name = "...") private OtherClass oc; 

Maintenant la question est:

Est-ce que @Id + @JoinColumn identique à @PrimaryKeyJoinColumn ?:

 @ManyToOne @PrimaryKeyJoinColumn(name = "...") private OtherClass oc; 

Si ce n’est pas le cas, à quoi @PrimaryKeyJoinColumn ?

    Que se passe-t-il si je fais la promotion de la colonne pour être un / le PK (relation identificasortingce aka)? Comme la colonne est maintenant la PK, je dois la marquer avec @Id (…).

    Cette prise en charge améliorée des identificateurs dérivés fait en réalité partie des nouvelles fonctionnalités de JPA 2.0 (voir la section 2.4.1 Clés primaires correspondant aux identités dérivées dans la spécification JPA 2.0). JPA 1.0 n’autorise pas les Id sur OneToOne ou ManyToOne . Avec JPA 1.0, vous devez utiliser PrimaryKeyJoinColumn et définir un mappage d’ Id Basic pour la colonne de clé étrangère.

    Maintenant, la question est: est-ce que @Id + @JoinColumn est identique à @PrimaryKeyJoinColumn?

    Vous pouvez obtenir un résultat similaire, mais l’utilisation d’un Id sur OneToOne ou ManyToOne est beaucoup plus simple et constitue la méthode préférée pour mapper les identificateurs dérivés avec JPA 2.0. PrimaryKeyJoinColumn peut toujours être utilisé dans une stratégie d’inheritance JOINED . Ci-dessous la section pertinente de la spécification JPA 2.0:

    11.1.40 Annotation PrimaryKeyJoinColumn

    L’annotation PrimaryKeyJoinColumn spécifie une colonne de clé primaire utilisée comme clé étrangère pour se PrimaryKeyJoinColumn à une autre table.

    L’annotation PrimaryKeyJoinColumn est utilisée pour joindre la table primaire d’une sous-classe d’entité dans la stratégie de mappage JOINED à la table primaire de sa superclasse; il est utilisé dans une annotation SecondaryTable pour joindre une table secondaire à une table primaire; et il peut être utilisé dans un mappage OneToOne dans lequel la clé primaire de l’entité faisant référence est utilisée comme clé étrangère de l’entité référencée [108] .

    Si aucune annotation PrimaryKeyJoinColumn n’est spécifiée pour une sous-classe dans la stratégie de mappage JOINED, les colonnes de clé étrangère sont supposées avoir les mêmes noms que les colonnes de clé primaire de la table primaire de la superclasse.

    Exemple: sous-classe Customer et ValuedCustomer

     @Entity @Table(name="CUST") @Inheritance(strategy=JOINED) @DiscriminatorValue("CUST") public class Customer { ... } @Entity @Table(name="VCUST") @DiscriminatorValue("VCUST") @PrimaryKeyJoinColumn(name="CUST_ID") public class ValuedCustomer extends Customer { ... } 

    [108] Les mécanismes d’identification dérivés décrits à la section 2.4.1.1 doivent maintenant être préférés à PrimaryKeyJoinColumn pour le cas de mappage OneToOne.

    Voir également

    • Clés primaires via OneToOne Relationships

    Cette source http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state indique que l’utilisation de @ManyToOne et @Id fonctionne avec JPA 1.x. Qui est correct maintenant?

    L’auteur utilise une version d’EclipseLink conforme à JPA 2.0 (version 2.0.0-M7 à la date de l’article) pour publier un article sur JPA 1.0 (!). Cet article est trompeur, l’auteur utilise quelque chose qui ne fait pas partie de JPA 1.0.

    Pour mémoire, la prise en charge de Id sur OneToOne et ManyToOne a été ajoutée dans EclipseLink 1.1 (voir ce message de James Sutherland , membre d’EclipseLink et principal consortingbuteur du livre wiki Java Persistence ). Mais laissez-moi insister, cela ne fait pas partie de JPA 1.0.

    Je distingue normalement ces deux via ce diagramme:

    Utilisez PrimaryKeyJoinColumn

    entrer la description de l'image ici

    Utilisez JoinColumn

    entrer la description de l'image ici