Среда:
У меня есть User
сущность:
@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
* * * * * * * *1032* произведено @RequestScoped
(поэтому я пытаюсь объединить две разные EntityManager
s ...).
Я пытался сделать entityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCREMENT)
до entityManager.merge(...)
(, как здесь сказано ), но это не помогло.
Я использую Seam 3 с JBoss 7.0.2.Final (который использует Hibernate 4).