【问题标题】:Using Hibernate sequence generators manually手动使用 Hibernate 序列生成器
【发布时间】:2009-09-09 15:21:06
【问题描述】:

基本上,我想要一种以与数据库无关的方式访问序列值的方法。 用例是我在实体上有一个字段,我想根据递增值(而不是 id)设置该字段。

例如,假设我有一个Shipment 实体。在货件创建后的某个时间点,它会被发货。一旦发货,就会为其生成并分配一个清单编号。清单编号类似于 M000009 (“M”之后的内容是序列中的左填充值)。

有人问过类似的问题 here at SO ,但我不喜欢这个解决方案,因为它需要另一个表来维护,而且似乎是一种奇怪的关系。

有谁知道是否可以使用 hibernate 的MultipleHiLoPerTableGenerator 之类的东西而不是 ID 生成器?

如果这不可能,有谁知道处理这个问题的任何库(使用休眠甚至只是纯 JDBC)。我不想自己写这个(并且必须处理预取值、锁定和同步)。

谢谢。

【问题讨论】:

    标签: java hibernate jpa jdbc sequence


    【解决方案1】:

    我认为您的任务的复杂性取决于您的清单编号是否需要连续:

    • 如果您不需要连续的清单编号,那么这是快乐的日子,可以使用序列。
    • 如果您确实需要顺序清单编号(或者您的数据库不支持顺序),请使用带有适当锁定的 id 表,以便每个事务都获得唯一的顺序值。

    那么你有两个我能想到的选择:

    • 在您的客户端上编写必要的 JDBC 代码,确保(如果清单编号是连续的)正在使用的事务与用于数据库更新的事务相同。
    • 在发生适当更新时使用触发器创建清单编号。

    我认为我的偏好将是触发器,因为事务方面会得到处理,尽管这意味着对象需要在客户端刷新。

    【讨论】:

      【解决方案2】:

      我没有阅读链接的类似解决方案,但听起来像是我最终要做的事情。我为序列创建了一个表。我为我需要的每种序列类型在表中添加了一行。

      然后我有一个序列生成器类,它会执行必要的 sql 查询来获取和更新特定命名序列的序列值。

      我使用 hibernate 的 Dialect 类以一种 db 中立的方式来完成它。

      我也会“缓存”这些序列。我会将存储的序列值增加一个很大的数字,然后从我的生成器类中分配出那些分配的序列。如果类被销毁(即应用程序关闭),序列生成器的新实例将以存储的值启动。 (在我的序列号中有一个空白无关紧要)

      【讨论】:

        【解决方案3】:

        这是一个代码示例。我想警告这一点 - 我没有编译这个,它需要弹簧代码。话虽如此,它仍然应该提供您想做的事情的基础。

        public Long getManifestNumber() {
                final Object result = getHibernateTemplate().execute(new HibernateCallback() {
                    public Object doInHibernate(Session sess) throws HibernateException, SQLException { 
                        SQLQuery sqlQuery = sess.createSQLQuery("select MY_SEQUENCE.NEXTVAL from dual");
                        sqlQuery.uniqueResult();
                    }
                });
                Long toReturn;
                if (result instanceof BigDecimal) {
                    toReturn = ((BigDecimal)result).longValue();
                }
                return toReturn;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-04
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多