我正在创建一个使用Hibernate的Widgets记录。这很基础。我有一个描述对象的hbm.xml文件,一个创建并保存它们的DAO类等。
但是,窗口小部件有一个明确的排序顺序,每个新的窗口小部件都需要插入sortIndex
列值大于所有其他sortIndex
列值(即新窗口小部件是最后自动排序)。我无法为我的生活弄清楚如何实现这一目标。
Hibernate完全能够自动设置ID列,并且根据max(sortIndex)+1等公式或根据某些增加的顺序,它能够将其他列设置为唯一值是有意义的。生成器值,但我在文档中找不到这种东西的引用。有人能指出我正确的方向吗?
想到的一种方法是手动查询最高的sortIndex,但我开始担心两个不同的事务都找到相同的新sortIndex。
答案 0 :(得分: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
。这就是通向疯狂的道路。