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 ?

64
demandé sur Kawu 2010-08-05 20:49:00

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 la JOINED stratégie de mise en correspondance avec la table primaire de sa superclasse; il est utilisé dans un SecondaryTable annotation de rejoindre une table secondaire à une table primaire; et il peut être utilisé dans un OneToOne 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.

46
répondu Pascal Thivent 2017-05-23 11:55:03

je les différencie normalement par ce diagramme:

Utiliser PrimaryKeyJoinColumn

enter image description here

utiliser JoinColumn

enter image description here

9
répondu GMsoF 2018-02-14 03:29:57