Hibernate乐观锁定版本溢出



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

是否有一种方法,使版本回滚到零一旦达到任何限制(Java或MySQL的)?

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

编辑:我搜索了一下,发现了这个注释:@OptimisticLock(排除=true)。链接:http://bit.ly/nczCx1它似乎可以在理论上工作,但我还没有成功地使用它。有人知道如何正确使用这个注释吗?

好了,你已经达到整数的极限了。当你把它增加到,比如说'long',你就有另外四个字节可用。这已经足够了(当然,它仍然只是推迟了不可避免的事情)。

你可以达到旧的限制(2**32更新)正好2**32次,在它开始溢出之前。让我们假设它需要1秒来获得这么多更新(我猜你花了更长的时间),那么你需要另外2**32秒(或大约136年)才能溢出很长时间。

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

@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属性被更新(并持久化),版本也不会增加。

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

参见映射JPA和Hibernate的实体版本属性的最佳方法

最新更新