JPA @Version: как это использовать? - PullRequest
15 голосов
/ 03 декабря 2009
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private int salary;

    @Version
    private long version;

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

1 Ответ

13 голосов
/ 03 декабря 2009

Я бы сказал:

  1. требуется установить / получить версию, так как вы можете иногда назначать версию самостоятельно (при воссоздании нового экземпляра из старых данных)
  2. Вам не нужно, если вы читаете экземпляр из базы данных. (При создании его в вашем коде с новым, это будет другая история).
  3. Я больше ничего не вижу. У меня никогда не было проблем с базой данных.
  4. По моему мнению, модульное тестирование не подходит для базы данных, поэтому тесты с использованием базы данных называются интеграционными тестами. Их не должно быть слишком много, поскольку они медленные, и они на самом деле не проверяют ваш код, а больше кодов Hibernate / Driver / Database ... Вы должны доверять им или просто протестировать их один раз, но не для всех ваших лиц.
    Чтобы увидеть значения версии больше 0, прочитайте / измените / обновите вашу сущность в транзакции, версия увеличится на единицу. Выйдите из транзакции, сделайте это снова, значение увеличивается ...
  5. Версия будет увеличиваться при каждом изменении строки базы данных.
...