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!

Était-ce utile?

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 un OneToOne   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 de JOINED, 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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top