121 votes

Comment créer et gérer une clé primaire composite dans JPA ?

Je veux avoir des versions à partir de la même saisie de données. En d'autres termes, je veux dupliquer l'entrée avec un autre numéro de version.

id - Version sera la clé primaire.

À quoi doit ressembler l'entité ? Comment puis-je la dupliquer avec une autre version ?

id Version ColumnA

1   0      Some data
1   1      Some Other data
2   0      Data 2. Entry
2   1      Data

261voto

Rohit Jain Points 90368

Vous pouvez faire un Embedded class qui contient vos deux clés, et ensuite avoir une référence à cette classe en tant que EmbeddedId dans votre Entity .

Vous auriez besoin du @EmbeddedId y @Embeddable annotations.

@Entity
public class YourEntity {
    @EmbeddedId
    private MyKey myKey;

    @Column(name = "ColumnA")
    private String columnA;

    /** Your getters and setters **/
}

@Embeddable
public class MyKey implements Serializable {

    @Column(name = "Id", nullable = false)
    private int id;

    @Column(name = "Version", nullable = false)
    private int version;

    /** getters and setters **/
}

Une autre façon d'accomplir cette tâche est d'utiliser @IdClass et placez vos deux id en ce que IdClass . Maintenant, vous pouvez utiliser @Id sur les deux attributs

@Entity
@IdClass(MyKey.class)
public class YourEntity {
   @Id
   private int id;
   @Id
   private int version;

}

public class MyKey implements Serializable {
   private int id;
   private int version;
}

11voto

Swapnil17 Points 224

La classe MyKey doit implémenter Serializable si vous utilisez @IdClass

5voto

callfarc0de Points 96

Classe clé :

@Embeddable
@Access (AccessType.FIELD)
public class EntryKey implements Serializable {

    public EntryKey() {
    }

    public EntryKey(final Long id, final Long version) {
        this.id = id;
        this.version = version;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getVersion() {
        return this.version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public boolean equals(Object other) {
        if (this == other)
            return true;
        if (!(other instanceof EntryKey))
            return false;
        EntryKey castOther = (EntryKey) other;
        return id.equals(castOther.id) && version.equals(castOther.version);
    }

    public int hashCode() {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + this.id.hashCode();
        hash = hash * prime + this.version.hashCode();
        return hash;
    }

    @Column (name = "ID")
    private Long id;
    @Column (name = "VERSION")
    private Long operatorId;
}

Classe d'entité :

@Entity
@Table (name = "YOUR_TABLE_NAME")
public class Entry implements Serializable {

    @EmbeddedId
    public EntryKey getKey() {
        return this.key;
    }

    public void setKey(EntryKey id) {
        this.id = id;
    }

    ...

    private EntryKey key;
    ...
}

Comment puis-je le dupliquer avec une autre version ?

Vous pouvez détacher l'entité qui a été récupérée du fournisseur, changer la clé d'entrée et ensuite la persister comme une nouvelle entité.

2voto

Ranuka Points 643

La classe MyKey (@Embeddable) ne doit pas avoir de relations comme @ManyToOne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X