2011-08-21 139 views
2

我正在使用hibernate併爲休眠鎖定目的提供版本列。問題是,應用程序會經常更新一個條目,以致版本列達到Java的int限制。 MySQL的限制也可能達到。Hibernate樂觀鎖定版本溢出

是否有辦法讓版本一旦達到任何限制(Java或MySQL)就回滾到零?

當然,我可以放大數據類型很長。但這只是推遲了不可避免的。

編輯:我搜索了一下,發現這個註釋:@OptimisticLock(excluded = true)。鏈接:http://bit.ly/nczCx1它似乎可以在理論上工作,但我沒有成功地使用它。有誰知道如何正確使用這個註釋?

+2

一個「竅門」是,如果關閉應用程序並且沒有使用數據庫(例如,如果您正在對應用程序進行一些維護或部署新版本),則可以將所有版本重新設置回1沒有任何風險。 – Augusto

回答

1

@OtimisticLock(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

-1這不是解決方案,因爲它禁用*樂觀鎖定而不是解決溢出問題。 –

3

好吧,所以你已經達到了整數的極限,夠公平的。當你增加它時,假設'長'你有另外四個字節可供你使用。這足以綽綽有餘(它仍然只是推遲了不可避免的,當然)。

在開始再次溢出之前,您可以達到2 ** 32次的舊限制(2 ** 32次更新)。讓我們假設需要1秒鐘纔能有更多的更新(我猜這需要花費更長的時間),那麼需要另外2 ** 32秒(或者大約136年)來溢出一長串。

但我不知道是否有一個不同的優雅的解決方案,但如果沒有,我不會浪費時間這樣的細節。

+2

真的很挑剔:實際上並不是舊限制2 ** 31,因爲java int是32位有符號的。您的觀點仍然完全有效:) –