Quiero tener versiones de la misma entrada de datos. En otras palabras, quiero duplicar la entrada con otro número de versión.
id - Version
será la clave principal.
¿Cómo debería ser la entidad? ¿Cómo puedo duplicarlo con otra versión?
id Version ColumnA 1 0 Some data 1 1 Some Other data 2 0 Data 2. Entry 2 1 Data
Puede hacer una Embedded class
, que contiene sus dos claves, y luego tener una referencia a esa clase como EmbeddedId
en su Entity
.
Necesitarías las anotaciones @EmbeddedId
y @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 **/ }
Otra forma de lograr esta tarea es usar la anotación @IdClass
, y colocar ambos su id
en esa IdClass
. Ahora puede usar la anotación @Id
normal en ambos 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; }
La clase MyKey debe implementar Serializable
si está utilizando @IdClass
Clase clave:
@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; }
Clase de entidad:
@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; ... }
¿Cómo puedo duplicarlo con otra versión?
Puede separar la entidad que se recuperó del proveedor, cambiar la clave de Entrada y luego persistir como una nueva entidad.
La clase MyKey (@Embeddable) no debería tener ninguna relación como @ManyToOne
Cuando @IdClass
anotación @IdClass
, otro consejo que encontré es que la anotación @Column
debe ir a los campos de la clase Entity ( YourEntity
en el código de ejemplo de RohitJan).