Как вручную установить поля @Version в Hibernate 4?

Среда:

У меня есть этот Пользователь объект:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer userId;

    @Version
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "VERSION", length = 19)
    private Date version;

    @Column(nullable = false, length = 20)
    private String login;

    // Getters and Setters
}

У меня есть страница поиска, на которой перечислены пользователи, затем я нажимаю на пользователя чтобы отредактировать его (указав его userId в URL-адресе).

В форме редактирования я сохраняю на сервере поля этого объекта, и когда я сохраняю своего пользователя, я делаю следующее:

User user = entityManager.find(User.class, userId)
user.setLogin(form.getLogin());
user.setVersion(form.getVersion());
user.setUserId(form.getUserId());
entityManager.merge(user);

Вопрос:

Итак, если я правильно понял оптимистическую блокировку с Hibernate, если я открою 2 вкладки в моем браузере для редактирования того же пользователя, затем обновите логин на первой вкладке и затем логин на второй вкладке, у меня должно быть OptimisticLockException не так ли?

На самом деле, в моем приложении это не так ... Я проверил, form.getVersion () возвращает одно и то же значение в обоих случаях, даже если это в второе обновление, user.version было обновлено первым редактированием.

Я что-то упускаю?

Создается EntityManager @RequestScoped (поэтому я использую два разных EntityManager , когда пытаюсь объединить ...).

Я пытался создать entityManager.lock (пользователь, LockModeType.OPTIMISTIC_FORCE_INCREMENT) до entityManager.merge (...) (, как сказано здесь ]), но это не помогло.

Я использую Seam 3 с JBoss 7.0.2.Final (который использует Hibernate 4).

9
задан Community 23 May 2017 в 12:10
поделиться