StaleObjectStateException при попытке добавить @Version в сущность JPA - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать hibernate envers в своем проекте для управления версиями. Использовал jpa, jpa repository, spring и hibernate в качестве поставщика.

Существует сущность jpa

@Entity
@Audited
@IdClass(CusomerId.class)
@Table(name = "Cusomer", uniqueConstraints = {
        @UniqueConstraint(columnNames = { "name", "surname", "org" })})
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@Getter
@Setter
public class Customer {
    @Id
    @Column(name = "name", length = 100, unique = false, nullable = false)
    private String name;

    @Id
    @Column(name = "surname", length = 100, unique = false, nullable = false)
    private String surname;

    @Id
    @Column(name = "org", length = 100, unique = false, nullable = false)
    private String org;

    @Column(name = "metaInfo", length = 100, unique = false, nullable = true)
    private String metaInfo;

    public Customer(String name, String surname, String org, String metaInfo) {
        this.name=name;
        this.surname=surname;
        this.org=org;
        this.metaInfo=metaInfo;
    }
}

В приложении я использую Jpa Repository, поэтому мой репозиторий выглядит как

@Repository
public interface CustomerRepository extends CrudRepository<Customer, CutomerId>{}

В моем потоке,

Customer customer1 = new Customer("aaa", "bbb", "23", "this is secret info1")
Customer customer2 = new Customer("aaa", "bbb", "23", "this is secret info2 updated")
Customer customer3 = new Customer("aaa", "bbb", "23", "this is secret info3")

Я просто звоню

customerRepository.save(customer1); 
customerRepository.save(customer2);
customerRepository.save(customer3);

Код работает нормально, и в базе я обновил сущность. Но если я добавлю к своей сущности @Version версию; таблица, StaleObjectStateException, когда я пытаюсь сохранить клиента3.

Я ожидаю, что эта проблема связана с методом сохранения в SimpleJpaRepository. Если сущность существует, она пытается объединить новую сущность с сущностью с тем же ключом.

P.S. У меня есть gor этот вопрос, но я верю, что существует правильный способ решить эту проблему. Вместо save и merge других времен сущности, я в первый раз пишу в базу, в других случаях я читаю из базы и обновляю сущность вручную

public void add(String name, String surname, String age,
                    String metaInfo) {
        Customer customer = CustomerRepository.findRiskBustomerByNameAndSurnameAndAge(
                name, surname, age);

        if (customer == null) {
            customer = new Customer(name, surname,
                    age, metaInfo);

            customerRepository.save(customer);
        } else {
            customer.setMetaInfo(metaInfo);

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