3

我正在使用休眠,并且为休眠锁定目的提供了一个版本列。问题是应用程序会经常更新条目,以至于int版本列达到了 Java 的限制。有可能int也达到了 MySQL 的限制。

一旦达到任何限制(Java 或 MySQL),有没有办法让版本回滚到零?

当然,我可以将数据类型放大为长。但这只是在推迟不可避免的事情。

编辑:我搜索了一下,发现了这个注释:@OptimisticLock(excluded=true)。链接:http ://bit.ly/nczCx1好像理论上可以工作,但是我没有成功使用。有谁知道如何正确使用这个注释?

4

3 回答 3

3

好的,所以你已经达到了整数的限制,这很公平。当您将其增加到“长”时,您还有另外四个字节可供您使用。这绰绰有余(它仍然只是延迟了不可避免的事情,当然)。

在它再次开始溢出之前,您可以准确地达到旧限制(2**32 次更新)2**32 次。让我们假设有这么多更新需要 1 秒(我猜你需要更长的时间),然后你需要 2**32 秒(或大约 136 年)才能溢出很长的时间。

但我不知道是否有其他优雅的解决方案,但如果没有,我不会浪费时间在这些细节上。

于 2011-08-21T15:33:11.853 回答
0

@OptimisticLock(excluded=true) 有效!我只是忘了确保我把它放在每个更新的属性上。它不允许按承诺增加版本号。

例子:

@Entity
@Table(name="some_table")
public class SomeEntity extends BaseEntity {
    //... some code

    @Column
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    @OptimisticLock(excluded=true)
    private DateTime lastUsed = new DateTime();

    //... some code
}

这样,即使 lastUsed 属性被更新(并持久化),版本也不会增加。

于 2011-08-22T22:28:26.230 回答
0

版本号仅与其他用户编辑同一对象的时间相关。一旦所有打开的编辑完成,您可以从版本 1 重新开始,并具有相同的安全性(当然 Hibernate 不会将版本重置为 0)。

请参阅使用 JPA 和 Hibernate 映射实体版本属性的最佳方法

于 2021-11-04T14:27:40.617 回答