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

Je veux avoir des versions de la même entrée 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.

Comment 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 

Vous pouvez créer une Embedded class contenant vos deux clés, puis faire référence à cette classe en tant que EmbeddedId dans votre Entity .

Vous auriez besoin des annotations @EmbeddedId et @Embeddable .

 @Entity public class YourEntity { @EmbeddedId private MyKey myKey; @Column(name = "ColumnA") private Ssortingng 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 deux id dans cette IdClass . Vous pouvez maintenant utiliser une annotation @Id normale sur les deux atsortingbuts

 @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; } 

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

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 une entité extraite du fournisseur, modifier la clé d’entrée puis la conserver en tant que nouvelle entité.

La classe MyKey (@Embeddable) ne devrait pas avoir de relation comme @ManyToOne

Lors de l’utilisation de l’annotation @IdClass , une autre astuce que j’ai trouvée est que l’annotation @Column doit aller dans les champs de la classe d’entité ( YourEntity dans l’exemple de code de RohitJan).