JPA @Version: как его использовать?

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private int salary;

    @Version
    private long version;

    // ...getters and setters
}
  • Требуется создать setter/getter для version?
  • При сохранении этой сущности с Hibernate мне не нужно устанавливать это значение вручную, не так ли?
  • Что еще мне нужно настроить, чтобы использовать оптимистическую проверку concurrency с помощью Spring hibernateTemplate.saveOrUpdate? Поддерживаются ли все базы данных?
  • Как выполнить модульное тестирование этого объекта? В моей базе данных все мои записи, отображающие поле версии, имеют значение 0
  • Будет ли вызов hibernateTemplate.saveOrUpdate увеличивать значение версии каждый раз?

Ответы

Ответ 1

Я бы сказал:

  • требуется установить/получить версию, так как вы можете иногда назначать версию (при воссоздании нового экземпляра из старых данных)
  • Вам не нужно, если вы читаете экземпляр из базы данных. (Создав его в своем коде с новым, это будет другая история).
  • Я больше ничего не вижу. У меня никогда не было проблем с базой данных.
  • Unit test не переходите на базу данных, на мой взгляд, поэтому тесты, связанные с базой данных, называются интеграционными тестами. У вас не должно быть слишком много, поскольку они медленны, и они действительно не проверяют ваш код, но больше кодов Hibernate/Driver/Database... Вы должны доверять им или просто тестировать их один раз, но не для всех ваших сущностей.
    Чтобы увидеть значения версий более 0, прочитайте/измените/обновите свою сущность в транзакции, версия увеличится на единицу. Выйдите из транзакции, сделайте это снова, значение увеличивается...
  • Версия будет увеличиваться при каждом изменении строки базы данных.