当前位置: 首页 > 面试题库 >

Java-JPA-@Version批注

柯立果
2023-03-14
问题内容

@Version批注在JPA中如何工作?

我找到了各种答案,摘录如下:

JPA使用实体中的版本字段来检测对同一数据存储记录的并发修改。当JPA运行时检测到尝试同时修改同一记录的尝试时,它将向尝试最后提交的事务抛出异常。

但是我仍然不确定它是如何工作的。

同样从以下几行开始:

您应该考虑版本字段是不变的。更改字段值会产生不确定的结果。

这是否意味着我们应该将version字段声明为final


问题答案:

但是我仍然不确定它是如何工作的?

假设一个实体MyEntity具有带注释的version属性:

@Entity
public class MyEntity implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

更新时,带有注释的字段@Version将增加并添加到WHERE子句中,如下所示:

UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))

如果WHERE子句未能匹配记录(因为同一实体已经被另一个线程更新),则持久性提供程序将抛出OptimisticLockException

这是否意味着我们应该将我们的version字段声明为final

不可以,但是您可以考虑使二传手受到保护,因为您不应该称呼它。



 类似资料:
  • 问题内容: 我在Hibernate 3.6.x中使用JPA2 我对@Version进行了简单测试。 假设我们有2个实体, 实体团队具有玩家实体列表,双向关系,惰性获取类型,级联类型全部 两个实体都有@Version 这是场景: 每当对团队/球员实体之一进行修改时,刷新/提交时,团队/球员的版本就会增加(修改后的记录的版本会增加)。 使用persist将新的球员实体添加到团队的集合中,将在persi

  • 问题内容: 是否需要为创建setter / getter ? 当使用Hibernate持久化该实体时,我不需要手动设置此值,对吗? 为了在Spring的服务器上使用乐观并发检查,我还需要配置什么?是否支持所有数据库? 如何对该实体进行单元测试?在我的数据库中,所有显示版本字段的记录的值为0 每次调用都会增加版本值吗? 问题答案: 我会说: 必须设置/获取版本,因为有时您可能自己分配版本(从旧数据重

  • 问题内容: 我正在从本教程中学习JPA 。 我在理解以下注释时有些困惑: 可嵌入类型的字段默认为持久性,就像用@Embedded注释一样。 如果可嵌入类型的字段默认为持久性,那么为什么我们需要注释 问题答案: 该注解允许指定一个类,其实例存储为拥有实体的固有部分。此注释 没有属性 。 该注释用于指定其值是一个可嵌入类的实例实体的持久字段或属性。默认情况下,类中指定的列定义适用于拥有实体的表,但是

  • 问题内容: 我是JPA和Hibernate的新手,我对乐观锁定有疑问。我有一个拥有@Version注释字段的类。当我更新此类所代表的实体时,版本计数器不会增加。这是我的代码:该类: 这是主要方法: 控制台的内容如下: 有人可以告诉我怎么了吗? 编辑: 好的,我尝试了一些。我已将锁定设置为LockModeType.OPTIMISTIC_FORCE_INCREMENT并收到以下错误消息: 因此,很明显

  • 问题内容: 我正在阅读使用Spring框架进行的事务管理。在第一个组合中,我使用了Spring + hiberante,并使用了Hibernate的API来控制事务(Hibenate API)。接下来,我想使用注释进行测试,它确实起作用。 我对此感到困惑: JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使

  • 签名 m.version 参数 类型 是否必须 描述 返回 String 返回版本号 工作原理 m.version 属性会返回当前 Mithril 的版本号。 版本号使用 semver 规范,格式为 “0.0.0”,第一个数字是主板本号,第二个数字是次版本好,第三个数字是修订版本号。 当有向下不兼容的 API 更改时,更新主版本号 当添加新功能,且向下兼容时,更新次版本号 当修复 bug,且向下兼