Reputation: 1395
There is code, when I try to create four customers. 1. write Customer1,2 to database 2. merge Customer3(with same id such as 1) 3. merget Customer4(with same id again) I want to create any versions of same entity
So,
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Info");
EntityManager entityManager = entityManagerFactory.createEntityManager();
Customer customer1 = new Customer("1", "Vladislav");
Customer customer2 = new Customer("2", "Maria");
Customer customer3 = new Customer("1", "Ekaterina");
Customer customer4 = new Customer("1", "Helen");
entityManager.getTransaction().begin();
entityManager.persist(customer1);
entityManager.persist(customer2);
entityManager.getTransaction().commit();
entityManager.getTransaction().begin();
entityManager.merge(customer3);
entityManager.getTransaction().commit();
entityManager.getTransaction().begin();
entityManager.merge(customer4);
entityManager.getTransaction().commit();
//get versions here:
entityManager = entityManagerFactory.createEntityManager();
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> versions = auditReader.getRevisions(Customer.class, "1");
System.out.println("========");
System.out.println(Arrays.toString(versions.toArray()));
entityManager.close();
entityManagerFactory.close();
}
Customer entity:
package entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.envers.Audited;
import javax.persistence.*;
@Getter
@Setter
@NoArgsConstructor
@Entity
@Audited
public class Customer {
@Id
@Column(length = 100, nullable = false)
private String id;
private String name;
@Version
int version;
public Customer(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Customer{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", version=" + version +
'}';
}
}
When I persist only customer 1,2 and merge customer 3 - everything okey.
But in I add mergin with customer4 entity - there is error message occours -
Exception in thread "main" javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [entity.Customer#1] Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [entity.Customer#1] ... 2 more
Why I can't merge any times?
Upvotes: 0
Views: 772
Reputation:
You can only merge a Customer with an instance having an up-to-date version.
customer1
has version=0
Current version for id = '1' is now 0
customer3
has version=0, therefore merge is possible and after merge version=1.
Current version for id = '1' is now 1
customer4
has version=0, therefore merge is no longer possible.
Upvotes: 1