Среда:
У меня есть этот Пользователь
объект:
@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).