一尘不染

Oracle Hibernate序列生成器问题

hibernate

我正在使用oracle 11g,Java(struts2)和Hibernate开发应用程序。

我有一个名为mytemp的表,其列mytemp_id为NUMBER(22,0)类型。

在我的mytemp.hbm.xml文件中,ID如下所示

<id name="mytempId" type="big_decimal">
        <column name="MYTEMP_ID" precision="22" scale="0" />
        <generator class="sequence">
            <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
        </generator>
    </id>

在我的Oracle数据库中,创建了名为“ MYTEMP_TEMP_ID_SEQ”的序列,并在Oracle中正常工作。

现在,当我尝试使用hibernate方式插入记录时,出现以下错误

org.hibernate.id.IdentifierGenerationException:此ID生成器生成long,integer,short或string

看来,当我的序列返回Number时,hibenate将其视为BigDecimal,而hibernate的sequece生成器类仅考虑了long,integer,short和string值。

Hibernate的BigDecimal应该不会有问题。但是我认为他们还没有为序列生成器实现BigDecimal

谁能帮助我解决问题?

谢谢。


阅读 230

收藏
2020-06-20

共1个答案

一尘不染

老实说,我无法想象为什么您会坚持将ID设为BigDecimal而不是long。最大长值9,223,372,036,854,775,807虽然确实是最大NUMBER(22)值的千分之一,但实际上应该
足够 。如果您 每秒* 要生成一 百万个 标识符,则必须 花费30万年的 时间才能耗尽序列。 ***

就是说,为了使您的标识符生成为BigDecimal,您将需要编写自己的生成器。您可以通过扩展Hibernate的内置SequenceGenerator并覆盖其generate()方法来实现。无需通过IdentifierGeneratorFactory.get()仅支持long
/ int / short / String 的调用,您可以从结果集中获取序列值作为BigDecimal。

然后,需要通过指定生成器的完整类名来声明生成器

<generator class="com.mypackage.BigDecimalGenerator">
  <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
</generator>
2020-06-20