2009-08-24 50 views
1

我正在使用Hibernate創建Widgets的記錄。這很基本。我有一個描述對象的hbm.xml文件,一個創建並保存它們的DAO類,等等。將生成的值插入休眠記錄

但是,有一個顯式的窗口小部件排序順序,每個新的窗口小部件需要插入一個sortIndex列值大於所有其他sortIndex列值(即新的小部件自動排序最後)。我不能爲我的生活找出如何做到這一點。

Hibernate完全能夠自動設置ID列,它對於我來說是有意義的,它可以根據像max(sortIndex)+1這樣的公式將某些其他列設置爲唯一值,或者根據某些增加序列發生器的值,但我無法在文檔中找到這樣的參考。有人能指出我正確的方向嗎?

想到的一種方法是手動查詢最高排序索引,但是我開始擔心兩個不同的事務,都發現相同的新sortIndex。

回答

1

我討厭這麼說,但我認爲你最好只是以編程的方式來做這件事。只是一些在該行:

public void saveNewWidget(Widget widget) { 
    Session session = ...; 
    int sortIndex = ((Integer) session.createQuery("select max(w.sortIndex) from Widget w").uniqueResult()) + 1; 
    widget.setSortIndex(sortIndex); 
    session.save(widget); 
} 

(注:不是線程安全的,我不能看到一個很好的方法,使之安全,除了通過鎖定整個表我會怪疲倦。)

原因是它既不UserType也不是自定義Interceptor可以幫助你在這裏。所以,如果你真的想自己做這個,你可能需要自己編寫ClassPersister。這是瘋狂的道路。