2010-11-17 26 views
0

Étant donné les tableaux suivants:Comment implémenter l'héritage avec des tables ayant des clés primaires multi-colonnes/composites (JPA 1.0 @IdClass)?

CREATE TABLE Employees 
(
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    birth_date DATE NOT NULL, 
    PRIMARY KEY (first_name, last_name) 
); 

CREATE TABLE Managers 
(
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    salary INTEGER NOT NULL, 
    total_bonus INTEGER NULL, 
    PRIMARY KEY (first_name, last_name), 
    CONSTRAINT managers_employees_fk FOREIGN KEY (first_name, last_name) REFERENCES Employees (first_name, last_name) 
); 

CREATE TABLE Workers 
(
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    wage INTEGER NOT NULL, 
    PRIMARY KEY (first_name, last_name), 
    CONSTRAINT workers_employees_fk FOREIGN KEY (first_name, last_name) REFERENCES Employees (first_name, last_name) 
); 

comment voulez-vous mettre en œuvre l'entité et les classes de clé primaire composite en utilisant les annotations de JPA 1.0?

questions sous découlant sont:

  1. Est-ce que des sous-classes définissent leurs propres classes d'identité?
  2. Si tel est le cas, héritent-ils de la classe ID de la super classe?
  3. Est-ce que les sous-classes obtiennent des annotations @IdClass?

Notez que la question est intentionnellement naïve. Je voudrais voir les déclarations de classe, les propriétés avec des annotations d'accès au champ sans getters et setters suffira probablement.

Merci

+0

Notez que '(prénom, last_name)' est une idée * mauvaise * pour une clé primaire. Voir [cet article] (http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/). Personnellement, je connais au moins une personne sans prénom. –

+0

Ceci est juste un exemple et non une vraie clé choisie. Je connais les implications mais merci. – Kawu

Répondre

1

PK est défini dans la racine de l'arbre d'héritage. La racine définit tout. La spécification indique La clé primaire doit être définie sur la classe d'entité qui est la racine de la hiérarchie d'entités ou sur une superclasse mappée qui est une superclasse (directe ou indirecte) de toutes les classes d'entités dans la hiérarchie d'entités. La clé primaire doit être définie exactement une fois dans une hiérarchie d'entités.

+0

Donc, en conséquence de cela, les relations d'héritage/sous-tables peuvent ne jamais étendre l'ensemble des colonnes clés primaires ??? – Kawu

+0

Oui, réponse mise à jour pour refléter le libellé des spécifications – DataNucleus

+0

Bon, cela signifie également que les sous-classes n'obtiennent pas d'annotations @IdClass? – Kawu