Hibernate JPA';s乐观锁定知道在Long.MAX_值之后循环到零吗?
我有一个经常更新的类,我通过以下方式使用JPA的乐观锁定: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
@Version
public long getVersion() {
return version;
}
我看到我的测试系统的价值变得相当大,我对生产感到紧张。JPA(我正在使用hibernate)处理Long.MAX_值,还是我需要自己处理
谢谢,
BenJPA规范没有提到当它达到版本列的最大值时会发生什么行为。我做了一点测试,看看它是如何工作的 在Java中,
Long.MAX_值
相当于:9223372036854775807
我测试了MySQL作为我的数据库。根据,映射到Java的Java.util.Long
类型的BIGINT
也具有相同的最大值:9223372036854775807
在Java中,当您递增Long.MAX_值
并打印结果时,您将得到-9223372036854775808
,这相当于Long.MIN_值
。所以我们可以说,一旦Java达到最大值,它就会回到最小值。MySQLBIGINT
的最小值也与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