Roberto
Roberto

Reputation: 1395

Jpa merge throws StaleObjectStateException?

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

Answers (1)

user10527814
user10527814

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

Related Questions