gpt4 book ai didi

hibernate - 如何使用 Hibernate 4 手动设置 @Version 字段?

转载 作者:行者123 更新时间:2023-12-02 21:33:07 25 4
gpt4 key购买 nike

环境:

我有那个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
}

我有一个列出用户的搜索页面,然后我单击用户对其进行编辑(在 URL 中给出其 userId)。

在编辑表单中,我将该实体的字段存储在服务器上,当我保存用户时,我会执行以下操作:

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.merge(...) (as said here ) 之前执行 entityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCRMENT),但是这没有帮助。

我正在将 Seam 3 与 JBoss 7.0.2.Final(使用 Hibernate 4)一起使用。

最佳答案

我刚刚对此做了一些更多的研究。

根据 JPA 规范,不允许修改版本字段:

JPA 2.0 最终规范,第 3.4.2 节:

An entity may access the state of its version field or property or export a method for use by the application to access the version, but must not modify the version value. With the exception noted in section 4.10, only the persistence provider is permitted to set or update the value of the version attribute in the object.

注意:4.10 节涉及忽略版本属性的批量更新。

关于hibernate - 如何使用 Hibernate 4 手动设置 @Version 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com