2009-12-03 4 views
15
@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. Что еще мне нужно настроить, чтобы использовать оптимистичную проверку параллелизма с помощью Spring hibernateTemplate.saveOrUpdate? Поддерживаются ли все базы данных?
  4. Как провести тестирование этого объекта? В моей базе данных все мои записи, отображающие поле версии, имеют значение 0
  5. Будет ли вызов hibernateTemplate.saveOrUpdate увеличивать значение версии каждый раз?

ответ

12

Я хотел бы сказать: требуется

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

@ KLE на всякий случай 2 пользовательский вызов hibernatetemplate.saveorupdate в то же время, нет необходимости ставить дополнительную проверку при вызове hibernatetemplate.saveorupdate? любое исключение бросает? – cometta

+1

@cometta Точка не в том, чтобы сохранить или нет, но откуда поступают данные. В транзакции **, если вы читаете объект из базы данных **, информация о версии обновлена. Когда вы его сохраняете, это берется автоматически. Если вы когда-нибудь захотите получить данные из другого источника (например, сообщение формы) и заново создадите объект, то вам придется заботиться о версии самостоятельно. – KLE

+0

Очень хорошее объяснение здесь: http://en.wikibooks.org/wiki/Java_Persistence/Locking – Zilvinas

 Смежные вопросы

  • Нет связанных вопросов^_^