Hibernate乐观锁定版本溢出

时间:2011-08-21 00:42:56

标签: hibernate version limit optimistic-locking

我正在使用hibernate,并为hibernate锁定目的提供了一个版本列。问题是应用程序将经常更新条目,以便版本列达到Java的int限制。可能还会达到MySQL的int限制。

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

当然,我可以将数据类型扩大到很长。但它只是推迟了不可避免的事情。

编辑:我用Google搜索并找到了这个注释:@OptimisticLock(excluded = true)。链接:http://bit.ly/nczCx1它似乎在理论上可行,但我还没有成功使用它。有谁知道如何正确使用这个注释?

2 个答案:

答案 0 :(得分:3)

好的,所以你达到了整数的极限,足够公平。当你增加它时,让我们说'long'你有另外四个字节可供你使用。这绰绰有余(它仍然只是延迟了不可避免的,当然)。

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

但我不知道是否有一个不同的优雅解决方案,但如果没有,我不会浪费时间来获取这些细节。

答案 1 :(得分:1)

@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属性,版本也不会增加。