2013-05-16 53 views
1

我想我有一個相當簡單的任務,即根據某些條件向表中添加新記錄時手動增加ID。JPA:手動增加,避免競爭條件(MySQL)

比方說,我有表格書和章。 Chapter有自動增量章節ID,外鍵BookId和章節號。每次我在書中添加章節時,我都希望ChapterNo爲本章所屬的特定書增加1。可以通過簡單的SQL語句完成:插入章節(BookId,ChapterNo)值(XXX,從BookId = XXX的章節中選擇max(ChapterNo)+ 1)。但有沒有辦法在JPA中做到這一點,並避免競爭條件(如果我先閱讀max ChapterNo然後再執行插入操作,將會發生這種情況)

更新:迄今爲止唯一合理的解決方案:實現數據庫觸發器負責增加章節號。那麼至少我不需要JPA方面的本地查詢

+0

我認爲你應該可以通過使用事務和悲觀鎖定來防止其他人同時插入章節。我知道JPA支持悲觀鎖定,但我不知道細節。 – Eelke

回答

1

也許這不是完整的解決方案,但是具有@OrderColumn註釋的JPA功能。

基本上,您實現了@OneToMany與List的關係,並且JPA將在數據庫的列中保留列表中元素的順序。塗敷於書和章節,將是這樣的:

@Entity 
public class Book 
{ 
    ... 
    @OneToMany(mappedBy="book") 
    @OrderColumn(name="chapterNo") 
    private List<Chapter> chapters; 
    ... 
} 

不過請注意,這可能會導致許多更新的情況下,命令列的列表更改一些元素。例如,如果您刪除第一章然後堅持該書,則所有其他章節都會更新以反映其在列表中的新位置。您也無法直接訪問chapterNo列以在查詢中使用,只是通過列表的索引進行隱式訪問。

+0

這很有趣,謝謝!用這種方法,是否有可能重新排列列表?即如果我想讓第1章變成2,反之亦然? – AndreiM

+0

是的,如果您在內存中重新排列列表,則在事務提交時它將負責使用新值更新訂單列 – German