Bonjour,

Dans mon application, je dispose d'un certain nombre d'objets persistants, qui ont tous une même en-tête en commun (un même ensemble de champs, présent dans toutes les tables). Dans cette en-tête se compose la primary key composée de 3 champs de chacun de mes objets : un ID à auto incrément, et deux clés étrangères.
Le problème, c'est que ça ne compile pas. Si je supprime la notion de PK composite dans mon code, ça compile bien. Pour faire ma PK j'ai créé une classe-ID comme le montre le bouquin.

Voici à quoi ressemble mon code :

  • Ma classe-clé :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
@Embeddable
public class CompositePK {
 
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;
    @ManyToOne
    protected Employee srcEmployee;
    @ManyToOne
    protected Employee destEmployee;
 
    // ...
}
  • Ma classe en-tête :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
@IdClass(CompositePK.class)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Header implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    /* Composite PK : */
    @Id
    protected Long id;
    @Id
    protected Employee srcEmployee;
    @Id
    protected Employee destEmployee;
 
    /* Other header fields */
    protected String field1;
    protected String field2;
    // ...
}
  • Ma classe concrète en bout de chaîne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
@Entity
public class Foo extends Header {
    // ...
}
Mon problème de compilation intervient sur cette dernière classe, avec le message d'erreur suivant sur la ligne @Entity : "The Entity has no primary key attribute defined"
Cette PK est bien définie par héritage, d'ailleurs, une PK simple (non composite) est bien détectée.

Petites précisions :
Je suis sur GlassFish Server Open Source Edition 3.0.1 (build 22) et JPA 2.0 dont voici un extrait du persistence.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
...
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
...
</persistence>
Merci par avance pour vos suggestions