【问题标题】:Inserting a generated value into a Hibernate record将生成的值插入 Hibernate 记录
【发布时间】:2009-08-24 18:04:16
【问题描述】:

我正在使用 Hibernate 创建一个小部件记录。这是非常基本的。我有一个描述对象的 hbm.xml 文件,一个创建和保存它们的 DAO 类,等等。

但是,小部件有一个明确的排序顺序,每个新小部件都需要插入一个大于所有其他 sortIndex 列值的 sortIndex 列值(即新小部件自动排在最后) .我终其一生都想不出如何做到这一点。

Hibernate 完全能够自动设置 ID 列,对我来说,它可以根据诸如 max(sortIndex)+1 之类的公式或根据一些递增的顺序将其他一些列设置为唯一值是有意义的生成器值,但我在文档中找不到这类事情的参考。有人能指出我正确的方向吗?

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

【问题讨论】:

    标签: hibernate


    【解决方案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。这就是通往疯狂的道路。

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 1970-01-01
      • 2012-07-18
      • 2019-06-19
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多