Hibernate JPA';s乐观锁定知道在Long.MAX_值之后循环到零吗?

Hibernate JPA';s乐观锁定知道在Long.MAX_值之后循环到零吗?,hibernate,jpa,Hibernate,Jpa,我有一个经常更新的类,我通过以下方式使用JPA的乐观锁定: @Version public long getVersion() { return version; } 我看到我的测试系统的价值变得相当大,我对生产感到紧张。JPA(我正在使用hibernate)处理Long.MAX_值,还是我需要自己处理 谢谢, BenJPA规范没有提到当它达到版本列的最大值时会发生什么行为。我做了一点测试,看看它是如何工作的 在Java中,Long.MAX_值相当于:92233720368

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

  @Version
  public long getVersion() {
    return version;
  }
我看到我的测试系统的价值变得相当大,我对生产感到紧张。JPA(我正在使用hibernate)处理Long.MAX_值,还是我需要自己处理

谢谢,
Ben

JPA规范没有提到当它达到版本列的最大值时会发生什么行为。我做了一点测试,看看它是如何工作的

在Java中,
Long.MAX_值
相当于:
9223372036854775807

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

在Java中,当您递增
Long.MAX_值
并打印结果时,您将得到
-9223372036854775808
,这相当于
Long.MIN_值
。所以我们可以说,一旦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
注释version字段,因此我可以手动设置
Long
的最大值。现在,我尝试将一个新的
TestEntity
持久化到MySQL数据库。使用以下代码:

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();
我手动将version字段设置为Long的最大值。正如MySQL数据库中所预期的,以下是我从表中得到的信息:

1 | test | 9223372036854775807
1 | changed | -9223372036854775808
现在,我更新了
TestEntity
代码。这次,我用
@version
注释了version字段

@实体 公共类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 | test | 9223372036854775807
1 | changed | -9223372036854775808

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

当前值有多大?既然您已经走了这么远。。。你能试着再更新一次版本吗?(想知道它是否能处理负数)是的。它实际上增加到了-9223372036854775807