gpt4 book ai didi

hibernate - JPA 的乐观锁定是否知道在 Long.MAX_VALUE 之后循环到零?

转载 作者:行者123 更新时间:2023-12-01 13:49:20 24 4
gpt4 key购买 nike

我有一个经常更新的类,我通过以下方式使用 JPA 的乐观锁定:

  @Version
public long getVersion() {
return version;
}

我看到我的测试系统的值(value)变得相当大,并且对生产感到紧张。 JPA(我正在使用 hibernate)是否处理​​ Long.MAX_VALUE 值,或者这是我需要自己处理的事情吗?

谢谢,本

最佳答案

JPA 规范没有提及版本列达到最大值时的行为。我做了一些测试,看看它的行为如何。

在 Java 中,Long.MAX_VALUE 等同于:9223372036854775807

我用 MySQL 作为我的数据库进行了测试。根据MySQL documentation ,映射到 Java 的 java.util.Long 类型的 BIGINT 也有相同的最大值:9223372036854775807

在 Java 中,当您递增 Long.MAX_VALUE 并打印结果时,您将得到 -9223372036854775808,这等同于 Long.MIN_VALUE。所以我们可以说,Java一旦超过最大值就会循环回到最小值。 MySQL BIGINT 的最小值也与 Java 相同:-9223372036854775808

下面是我使用 JPA 进行测试的方式:

我最初用 ff 创建了一个 TestEntity。代码:

@Entity
public class TestEntity implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private Long version;
private String name;
...
}

请注意,我首先没有使用 @Version 注释版本字段,因此我可以手动将 Long 设置为最大值。现在,我尝试将新的 TestEntity 持久化到 MySQL DB。使用以下代码:

em.getTransaction().begin();    
TestEntity test = new TestEntity();
test.setName("test");
test.setVersion(Long.MAX_VALUE); // manually set the version to the maximum value
em.persist(test);
em.getTransaction().commit();

我手动将版本字段设置为 Long 的最大值。正如在 MySQL 数据库中预期的那样,这是我从我的表中得到的:

1 | test | 9223372036854775807

现在,我更新了 TestEntity 代码。这次,我用 @Version 注释了版本字段。

@实体公共(public)类 TestEntity 实现序列化 {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Version
private Long version;
private String name;
...

然后,我创建了一个新代码来查找之前创建的 TestEntity 并更新其名称:

em.getTransaction().begin();
TestEntity testEntity = em.find(TestEntity.class, 1);
testEntity.setName("changed");
em.getTransaction().commit();

令人惊讶的是,我没有收到一条错误消息说我已达到最大值。相反,实体已成功更新。这是我表中的内容:

1 | changed | -9223372036854775808

你看,它确实循环回到了最小值。我假设 JPA 目前没有防止达到最大值的机制。它实际上只是使用 Java 的默认行为,即在达到最大值后循环回到最小值。

关于hibernate - JPA 的乐观锁定是否知道在 Long.MAX_VALUE 之后循环到零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33127728/

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