Jpa слияния выдает StaleObjectStateException? - PullRequest
0 голосов
/ 31 октября 2018

Есть код, когда я пытаюсь создать четырех клиентов. 1. записать Customer1,2 в базу данных 2. объединить Customer3 (с таким же идентификатором, как 1) 3. Merget Customer4 (снова с тем же идентификатором) Я хочу создать любые версии одной и той же сущности

Итак,

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();
    }

Клиентский объект:

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 +
                '}';
    }
}

Когда я сохраняю только клиента 1,2 и объединяю клиента 3 - все в порядке.

Но я добавляю mergin с сущностью customer4 - появляется сообщение об ошибке -

Исключение в потоке "main" javax.persistence.OptimisticLockException: строка была обновлена ​​или удалена другой транзакцией (или отображение несохраненного значения было неправильным): [entity.Customer # 1] Вызвано: org.hibernate.StaleObjectStateException: строка была обновлена ​​или удалена другой транзакцией (или отображение несохраненного значения было неправильным): [entity.Customer # 1] ... еще 2

Почему я не могу слиться ни разу?

1 Ответ

0 голосов
/ 31 октября 2018

Вы можете объединить Клиента только с экземпляром, имеющим актуальную версию.

customer1 имеет версия = 0

Текущая версия для id = '1' теперь 0

customer3 имеет версия = 0 , поэтому слияние возможно и после слияния версия = 1 .

Текущая версия для id = '1' теперь равна 1

customer4 имеет версию = 0 , поэтому объединение больше невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...