web-dev-qa-db-fra.com

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

Je veux avoir des versions 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.

A quoi devrait ressembler l'entité? Comment puis-je le 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
101
Kayser

Vous pouvez créer un _Embedded class_, qui contient vos deux clés, puis une référence à cette classe sous la forme EmbeddedId dans votre Entity.

Vous auriez besoin des annotations @EmbeddedId et @Embeddable .

_@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 de réaliser cette tâche consiste à utiliser l'annotation _@IdClass_ et à placer vos id dans cette IdClass. Maintenant, vous pouvez utiliser l'annotation normale _@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;
}
_
213
Rohit Jain

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

8
Swapnil17

Classe de 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 les entités extraites du fournisseur, modifier la clé de l'entrée, puis la conserver en tant que nouvelle entité.

4
callfarc0de

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

1
Ranuka