2009-08-04 5 views
1
@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Foo 

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class BarFoo extends Foo 

mysql> desc foo; 
+---------------+-------------+ 
| Field   | Type  | 
+---------------+-------------+ 
| id   | int   | 
+---------------+-------------+ 

mysql> desc barfoo; 
+---------------+-------------+ 
| Field   | Type  | 
+---------------+-------------+ 
| id   | int   | 
| foo_id  | int   | 
| bar_id  | int   | 
+---------------+-------------+ 

mysql> desc bar; 
+---------------+-------------+ 
| Field   | Type  | 
+---------------+-------------+ 
| id   | int   | 
+---------------+-------------+ 

Est-il possible de spécifier la colonne barfo.foo_id comme colonne jointe?Comment spécifier une colonne différente pour une annotation JPA @Inheritance

Etes-vous autorisé à spécifier barfoo.id comme @Id de BarFoo puisque vous remplacez le getter/seeter de la classe Foo? Je comprends les schémas derrière cette relation (ou du moins je pense que je le fais) et je suis d'accord avec eux. La raison pour laquelle je veux un champ d'identification explicite pour BarFoo est exactement parce que je veux éviter d'utiliser une clé jointe (foo _id, barre _id) lors de l'interrogation de BarFoo (s) ou lors d'une contrainte "strong". (comme le dit Ruben)

+0

Interrogation pour BarFoo et Foo peut être fait séparément, et les contraintes sur l'identification peut être plus fort pour BarFoo que pour Foo, tout en ayant la même clé. Je ne vois pas directement l'utilisation de choisir une stratégie d'héritage jointe et ayant des ID différents pour la superclasse et la sous-classe. – Ruben

+0

Puisque barfoo.id ne sera pas unique, comment pouvez-vous demander un BarFoo explicite ou l'utiliser comme une contrainte fk dans une autre table? – qnoid

+0

Puisque barfoo.id ne sera pas unique, comment pouvez-vous demander un BarFoo explicite? Lorsque vous interrogez avec HQL, vous pouvez simplement faire une requête pour BarFoo au lieu de Foo. Lorsque vous interrogez à partir de SQL, vous pouvez utiliser une jointure entre les tables BarFoo et Foo. – Ruben

Répondre

1

Lorsque InheritanceType.JOINED est défini, la colonne @Id sera automatiquement utilisée pour la jointure. Il n'y a qu'une valeur d'identifiant pour une instance de Barfoo, et cela est conservé dans la colonne id de la table foo et de la table barfoo.

Il n'est pas nécessaire d'avoir des colonnes id et foo_id séparées dans la table barfoo. Il n'est pas non plus nécessaire d'écraser par défaut l'id getter et le setter dans barfoo. Vous écraserez seulement l'id setter et getter si l'ID d'une instance de Barfoo a des contraintes plus fortes que l'id d'une instance de Foo.

1

Découvrez @PrimaryKeyJoinColumn

@PrimaryKeyJoinColumns({ 
    @PrimaryKeyJoinColumn(name="CHILD_PK1", 
     referencedColumnName="PARENT_PK1"), 
    @PrimaryKeyJoinColumn(name="CHILD_PK2", 
     referencedColumnName="PARENT_PK2") 
}) 
public class Child extends Parent { 
    ... 
} 
Questions connexes