2008-09-18 10 views
8

Je souhaite créer une entité qui possède une clé primaire générée automatiquement, mais également une clé composée unique composée de deux autres champs. Comment est-ce que je fais cela dans JPA?
Je veux faire cela parce que la clé primaire devrait être utilisée comme clé étrangère dans une autre table et la rendre composée ne serait pas bonne.Clés composées dans JPA

Dans l'extrait suivant, j'ai besoin que la commande et le modèle soient uniques. pk est bien sûr la clé primaire.

@Entity 
@Table(name = "dm_action_plan") 
public class ActionPlan { 
    @Id 
    private int pk; 
    @Column(name = "command", nullable = false) 
    private String command; 
    @Column(name = "model", nullable = false) 
    String model; 
} 
+0

Quel est le problème avec l'aide d'une clé composée comme une clé étrangère? –

Répondre

18

Vous pouvez utiliser @UniqueConstraint quelque chose comme ceci:

@Entity 
@Table(name = "dm_action_plan", 
     uniqueConstraints={ @UniqueConstraint(columnNames= "command","model") }) 
public class ActionPlan { 
    @Id 
    private int pk; 

    @Column(name = "command", nullable = false) 
    private String command; 

    @Column(name = "model", nullable = false) 
    String model; 
} 

Cela permettra à votre mise en œuvre de l'APP pour générer le DDL pour la contrainte unique.

+0

La forme correcte est la suivante: @Table (name = "dm_action_plan") @UniqueConstraint (columnNames = {"commande", "model"}) – homaxto

+0

homaxto: Selon la spécification EJB3.0, Michel a donné la bonne forme. – Nicolas

0

Utilisez @GeneratedValue pour indiquer que la clé sera générée et @UniqueConstraint pour exprimer unicidad

@Entity 
@Table(name = "dm_action_plan" 
     uniqueConstraint = @UniqueConstraint({"command", "model"}) 
) 
public class ActionPlan { 
    @Id 
    @GeneratedValue 
    private int pk; 
    @Column(name = "command", nullable = false) 
    private String command; 
    @Column(name = "model", nullable = false) 
    String model; 
} 

+0

Il ne créera pas de contrainte composée. Il créera deux contraintes, chacune pour chaque nom de colonne que vous avez annoté dans @UniqueConstraint. – emanuelcds

+0

Ensuite, votre implémentation JPA est incorrecte. La spécification JPA2, §11.1.49 columnNames est "Un tableau des noms de colonne qui composent la contrainte **" (contrainte, pas de contraintes). – Nicolas