Héritage Stratégie jointe à plusieurs colonnes non-Keyed
-
09-10-2019 - |
Question
J'ai deux classes Foo
et Bar
mis en correspondance avec deux tables différentes, et je les aime utiliser la stratégie d'héritage de JOINED
, mais en utilisant deux colonnes joint sans clé. Le schéma est assez bizarre, mais je suis coincé avec elle. Voici ma configuration:
@Entity
@Table(name="foo")
@Inheritance(strategy=InheritanceType.JOINED)
public class Foo {
@Id
private Integer uniqueFooId;
@Column(name="column1")
private String column1;
@Column(name="column2")
private String column2;
@Column(name="someValue")
private String someValue;
}
@Entity
@Table(name="bar")
public class Bar extends Foo {
@Id
private Integer uniqueBarId;
@Column(name="column1")
private String column1;
@Column(name="column2")
private String column2;
@Column(name="someOtherValue")
private String someOtherValue;
}
Je ne sais pas comment @Inheritance décide colonne à utiliser pour joindre contre, mais je suppose par défaut, il utilise la clé primaire (s). Je voudrais les rejoindre non seulement contre une colonne autre que la clé primaire, mais deux, dans ce cas column1
et column2
.
Je pourrais même être aller à ce sujet dans le mauvais sens. Je vous remercie de toute aide ou suggestions. Merci!
La solution
JPA ne permet que de multiples tables ou des tables héritées à assembler par les colonnes Id. Quel fournisseur JPA utilisez-vous? Certains offrent d'autres options.
Voir, http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys
Si vous utilisez EclipseLink vous pouvez définir tout type de vous joindre à l'aide d'un désir DescriptorCustomizer et addForeignKeyFieldNameForMultipleTable ().
Dans le cas contraire, si vous ne pouvez pas modifier le schéma, vous pouvez essayer de créer une vue qui fait la jonction et l'héritage de l'utilisation TABLE_PER_CLASS et cartographier la sous-classe à la vue.
Autres conseils
Je ne sais pas comment @Inheritance décide colonne à utiliser pour joindre contre, mais je suppose par défaut, il utilise la clé primaire (s).
dans la section suivante Ceci est correct, ce qui est expliqué de la spécification JPA 1.0
01/09/32 PrimaryKeyJoinColumn Annotation
L'annotation
PrimaryKeyJoinColumn
une colonne clé spécifie primaire qui est utilisé comme une clé étrangère à se joindre à une autre table.L'annotation est PrimaryKeyJoinColumn utilisé pour joindre la table primaire d'une sous-classe d'entité dans le mappage JOINTES stratégie à la table principale de sa superclasse; il est utilisé dans un annotation
SecondaryTable
à se joindre à une table secondaire à une table primaire; et il peut être utilisé dans unOneToOne
cartographie dans lequel la clé primaire de l'entité de référencement est utilisé en tant que clé étrangère à l'entité référencée....
Si aucune
PrimaryKeyJoinColumn
annotation est spécifiée pour une sous-classe dans la stratégie de mappage deJOINED
, la colonnes clés étrangères sont supposées ont le même nom que la clé primaire colonnes du tableau principal de la superclasse....
Et l'annotation ci-dessus (ou PrimaryKeyJoinColumns
lors de l'utilisation des clés composites) vous donne un certain contrôle sur le nom de la colonne de clé primaire de la table actuelle et nom de la colonne clé primaire de la table étant reliée à .
Je voudrais les rejoindre non seulement contre une colonne autre que la clé primaire, mais deux, dans ce cas colonne1 et colonne2.
Je ne suis pas sûr que cela fonctionne, mais je vais essayer la suivante (dans la sous-classe):
@Entity
@Table(name="bar")
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="column1",
referencedColumnName="column1"),
@PrimaryKeyJoinColumn(name="column2",
referencedColumnName="column2")
})
public class Bar extends Foo {
@Id
private Integer uniqueBarId;
@Column(name="column1")
private String column1;
@Column(name="column2")
private String column2;
@Column(name="someOtherValue")
private String someOtherValue;
}
Je me demande si le fournisseur JPA se plaindra ou non.
Références
- JPA 1.0 Spécification
- Section 1.9.32 "PrimaryKeyJoinColumn Annotation"
- Section 1.9.33 "PrimaryKeyJoinColumns Annotation"