我正在使用hibernate,并为hibernate锁定目的提供了一个版本列。问题是应用程序将经常更新条目,以便版本列达到Java的int
限制。可能还会达到MySQL的int
限制。
有没有办法让版本在达到任何限制(Java或MySQL)后回滚到零?
当然,我可以将数据类型扩大到很长。但它只是推迟了不可避免的事情。
编辑:我用Google搜索并找到了这个注释:@OptimisticLock(excluded = true)。链接:http://bit.ly/nczCx1它似乎在理论上可行,但我还没有成功使用它。有谁知道如何正确使用这个注释?
答案 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属性,版本也不会增加。