138

I want to have versions from the same data entry. In other words, I want to duplicate the entry with another version number.

id - Version will be the primary key.

How should the entity look like? How can I duplicate it with another version?

id Version ColumnA 1 0 Some data 1 1 Some Other data 2 0 Data 2. Entry 2 1 Data 
1
  • When using the @IdClass annotation, another tip I found is the @Column annotation should go into the Entity class' fields (YourEntity in RohitJan's sample code). Commented Nov 30, 2017 at 3:39

4 Answers 4

282

You can make an Embedded class, which contains your two keys, and then have a reference to that class as EmbeddedId in your Entity.

You would need the @EmbeddedId and @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 **/ } 

Another way to achieve this task is to use @IdClass annotation, and place both your id in that IdClass. Now you can use normal @Id annotation on both the attributes

@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; } 
Sign up to request clarification or add additional context in comments.

13 Comments

Is it possible to use @Generatedvalue for Id's by EmbeddedId
@Kayser. As far as I know. No. You have to explicitly set the value for them in your KeyClass instance, and then set that key class instance in your Entity.
@Kayser. @GeneratedValue can only be used to generate key values for a primary key, it cannot generate combination for composite keys.
@Kayser. See Section - 11.1.17 GeneratedValue Annotation of JPA 2.0 Specification. It clearly says that, @GeneratedValue can only be used with simple primary key.
@RohitJain just one thing: you actually cannot make embedded class public (needs to be in its own file to be public)
|
13

The MyKey class must implement Serializable if you are using @IdClass

Comments

5

Key class:

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

Entity class:

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

How can I duplicate it with another Version?

You can detach entity which retrieved from provider, change the key of Entry and then persist it as a new entity.

2 Comments

Ist it possible to define the id in Entrykey AUTOGENERATED. oder something like that @GeneratedValue(strategy = GenerationType.IDENTITY)
I'm also wondering how to calculate hash for 2 long primary keys. As for hash and prime in method hashCode in class EntryKey, can you tell me where that idea comes from?
2

The MyKey class (@Embeddable) should not have any relationships like @ManyToOne

1 Comment

Why not? Have you looked at this example?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.