将生成的值插入Hibernate记录

时间:2009-08-24 18:04:17

标签: hibernate

我正在创建一个使用Hibernate的Widgets记录。这很基础。我有一个描述对象的hbm.xml文件,一个创建并保存它们的DAO类等。

但是,窗口小部件有一个明确的排序顺序,每个新的窗口小部件都需要插入sortIndex列值大于所有其他sortIndex列值(即新窗口小部件是最后自动排序)。我无法为我的生活弄清楚如何实现这一目标。

Hibernate完全能够自动设置ID列,并且根据max(sortIndex)+1等公式或根据某些增加的顺序,它能够将其他列设置为唯一值是有意义的。生成器值,但我在文档中找不到这种东西的引用。有人能指出我正确的方向吗?

想到的一种方法是手动查询最高的sortIndex,但我开始担心两个不同的事务都找到相同的新sortIndex。

1 个答案:

答案 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。这就是通向疯狂的道路。