JPA: différence entre @JoinColumn et @PrimaryKeyJoinColumn?
Quelle est la différence exacte entre @JoinColumn
et @PrimaryKeyJoinColumn
?
Vous utilisez @JoinColumn
pour les colonnes qui font partie d'une clé étrangère. Une colonne typique pourrait ressembler (par exemple dans une table de jointure avec des attributs supplémentaires):
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
Ce qui se passe si je fais la promotion de la colonne à un/PK, trop (un.k.un. l'identification de la relation)? Comme la colonne est maintenant le PK, je dois l'étiqueter avec @Id
:
@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
maintenant la question Est:
est-ce que @Id
+ @JoinColumn
est la même chose que @PrimaryKeyJoinColumn
?:
@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;
si ce n'est pas le cas, à quoi sert @PrimaryKeyJoinColumn
?
2 réponses
Ce qui se passe si je fais la promotion de la colonne à un/PK, trop (un.k.un. l'identification de la relation)? Comme la colonne est maintenant le PK, je dois l'étiqueter avec @Id (...).
Cette amélioration de la prise en charge de dérivée des identifiants est en fait partie de la nouveautés dans la JPA 2.0 (voir la section 2.4.1 Clés Primaires Correspondant aux Dérivés Identités dans la JPA 2.0 spécification), JPA 1.0 ne permet pas Id
sur un OneToOne
ou ManyToOne
. Avec JPA 1.0, vous devez utiliser PrimaryKeyJoinColumn
et aussi définir un Basic
Id
mapping pour la colonne de clé étrangère.
maintenant la question Est: est-ce que @Id + @JoinColumn est la même que juste @PrimaryKeyJoinColumn?
Vous pouvez obtenir un résultat similaire, mais en utilisant un Id
sur OneToOne
ou ManyToOne
est beaucoup plus simple et est le moyen préféré pour cartographier les identificateurs dérivés avec JPA 2.0. PrimaryKeyJoinColumn
pourrait encore être utilisé dans un rejoint stratégie d'héritage. Sous la section pertinente de la norme JPA 2.0:
11.1.40 Annotation De La Colonne Primaire
Le
PrimaryKeyJoinColumn
annotation spécifie une colonne clé primaire qui est utilisé comme une clé étrangère pour se joindre à un autre table.Le
PrimaryKeyJoinColumn
annotation est utilisé pour joindre la table primaire de une sous-classe d'entités dans laJOINED
stratégie de mise en correspondance avec la table primaire de sa superclasse; il est utilisé dans unSecondaryTable
annotation de rejoindre une table secondaire à une table primaire; et il peut être utilisé dans unOneToOne
cartographie dans laquelle la clé primaire de l'entité de référence est utilisé comme un clé étrangère de la référence entité [108] ....
Si non
PrimaryKeyJoinColumn
l'annotation est spécifiée pour une sous-classe dans le cadre de la stratégie conjointe de cartographie, les colonnes à clé étrangère sont supposées avoir les mêmes noms que la clé primaire colonnes du tableau primaire de la superclasse....
exemple: sous-classe de la clientèle et de la valeur
@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] L'id dérivées de mécanismes décrit dans la section 2.4.1.1 sont maintenant de préférence sur
PrimaryKeyJoinColumn
pour le OneToOne cartographie des cas.
Voir aussi
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 a raison maintenant?
l'auteur utilise une pré-version JPA 2.0 version conforme de EclipseLink (version 2.0.0-M7 au moment de l'article) pour écrire un article sur JPA 1.0 (!). Cet article est trompeur, l'auteur utilise quelque chose qui est pas partie de JPA 1.0.
Pour l'enregistrement, le soutien de Id
sur OneToOne
et ManyToOne
a été ajouté dans EclipseLink 1.1 (voir ce message à partir de James Sutherland , EclipseLink comitter et principal contributeur de la Java Persistence wiki livre). Mais permettez-moi d'insister, c'est pas partie de JPA 1.0.