web-dev-qa-db-fra.com

JPA SQL - Plusieurs colonnes en tant que clé primaire

Si je veux que plusieurs colonnes constituent un identifiant.

Exemple SQL:

CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])

Comment puis-je faire cela avec une classe d'entité Jpa? par la définition de la colonne?

il suffit de définir le champ id comme:

value = Column1 + Column2 + Column3 // aint working.
8
Anders Pedersen

Vous devez avoir une classe pour votre clé composite:

public class CompositeKey implements Serializable {
    private int column1;
    private int column2;
    private int column3;
}

dans votre classe d'entité, utilisez l'annotation @IdClass:

@Entity
@IdClass(CompositeKey.class)
public class EntityExample {
    @Id
    private int column1;
    @Id
    private int column2;
    @Id
    private int column3;
    ...
    ...
}

Je pense que cela devrait fonctionner. J'espère que ça aide, à la vôtre!

Oui, et il y a l'autre solution, celle mentionnée par @jklee, les deux fonctionnent, c'est une question de préférence.

21
Raul Cuth

Utilisez @Embeddable et @EmbeddedId.

Exemple:

@Entity
public class Project {
    @EmbeddedId ProjectId id;
     :
}

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

Plus d'informations ici http://www.objectdb.com/Java/jpa/entity/id#Embedded_Primary_Key_

7
jklee

Si tous les champs de la classe font partie de la clé primaire, la solution serait assez simple (solution d'extension fournie par @ raul-cuth):

@Entity
@IdClass(EntityExample.class)
public class EntityExample implements Serializable {

    @Id
    private int column1;

    @Id
    private int column2;

    @Id
    private int column3;
}
3
heroin
  1. Utilisation de l'annotation @IdClass sur la classe @Entity suivie de l'annotation @Id sur des champs individuels faisant partie de la clé primaire composite.
  2. Vous pouvez également utiliser la classe @Embeddable qui peut être composée de champs individuels de la clé primaire composite, puis une référence de cette classe peut être utilisée comme attribut avec l'annotation @Embedded dans la classe @Entity .
2
Penguin