Java 手动使用Hibernate序列生成器

Java 手动使用Hibernate序列生成器,java,hibernate,jpa,jdbc,sequence,Java,Hibernate,Jpa,Jdbc,Sequence,基本上,我想要一种以与数据库无关的方式访问序列值的方法。 用例是我在实体上有一个字段,我想根据递增值(而不是id)设置该字段 例如,假设我有一个装运实体。在创建装运后的某个时间点,它将被装运。一旦发货,将为其生成并分配一个清单编号。清单编号类似于M000009(其中'M'后面的内容是序列中的左填充值) 有人问了一些类似的问题,但我不喜欢这个解决方案,因为它需要另一个表来维护,而且似乎有一种奇怪的关系 有人知道是否可以使用hibernate的MultipleHilopTableGenerator作

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

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

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

有人知道是否可以使用hibernate的
MultipleHilopTableGenerator
作为ID生成器以外的东西吗

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


谢谢。

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

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

我使用hibernate的方言类以一种与db无关的方式来完成它


我还将“缓存”序列。我会将存储的序列值大幅增加,然后从生成器类中分配这些已分配的序列。如果类被销毁(即应用程序关闭),序列生成器的新实例将在存储的值处启动。(我的序列号中有一个间隔并不重要)

这是一个代码示例。我想警告一下——我没有搞笑这个,它重新出现了spring代码。话虽如此,它仍然应该提供你想要做的事情的基本信息

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;
    }

我认为您任务的复杂性取决于您的清单编号是否需要按顺序排列:

  • 如果您不需要顺序清单编号,那么这是快乐的日子,可以使用顺序
  • 如果您确实需要顺序清单编号(或者您的数据库不支持顺序),则使用具有适当锁定的id表,以便每个事务都获得唯一的顺序值
然后我可以想到两个选项:

  • 在客户机上编写必要的JDBC代码,确保(如果清单编号是连续的)正在使用的事务与数据库更新的事务相同
  • 在适当的更新发生时,使用触发器创建清单编号
我认为我的偏好是触发因素,因为事务方面的事情会得到处理,尽管这意味着需要在客户机上刷新对象