Como criar e manipular chave primária composta em JPA

Eu quero ter versões da mesma input de dados. Em outras palavras, quero duplicar a input com outro número de versão.

id - Version será a chave primária.

Como deve ser a entidade? Como posso duplicá-lo com outra versão?

 id Version ColumnA 1 0 Some data 1 1 Some Other data 2 0 Data 2. Entry 2 1 Data 

Você pode criar uma Embedded class , que contém suas duas chaves, e depois fazer uma referência a essa class como EmbeddedId em sua Entity .

Você precisaria das annotations @Embeddable e @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 **/ } 

Outra maneira de realizar essa tarefa é usar a anotação @IdClass e colocar seu id nessa IdClass . Agora você pode usar a anotação @Id normal em ambos os atributos

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

A class MyKey deve implementar Serializable se você estiver usando @IdClass

Classe chave:

 @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 de entidade:

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

Como posso duplicá-lo com outra versão?

Você pode separar a entidade que foi recuperada do provedor, alterar a chave da Entrada e depois persistir como uma nova entidade.

A class MyKey (@Embeddable) não deve ter nenhum relacionamento como @ManyToOne

Ao usar a anotação @IdClass , outra dica que encontrei é que a anotação @Column deve entrar nos campos da class Entity ( YourEntity no código de exemplo do RohitJan).