Я пытаюсь использовать 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);
}