当前位置: 首页 > 面试题库 >

Oracle Hibernate序列生成器问题

年高洁
2023-03-14
问题内容

我正在使用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

谁能帮助我解决问题?

谢谢。


问题答案:

老实说,我无法想象为什么您会坚持将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>


 类似资料:
  • 我一整天都在尝试从JPA/Hibernate的Postgres获取序列,但它给了我所有的时间: 信息:Hibernate:调用tb_cdr_id_seq的下一个值警告:SQL错误: 0,SQLState: 42601错误:错误:语法错误在或附近“调用”严重:javax.persistence.持久性异常:org.hibernate.exception.SQLGrammar异常:无法提取结果集 Po

  • 如何像 Rxt-AA0001 Rxt-AA0002 Rxt-AA0003 ... ... Rxt-AA9999 Rxt-AB0001 Rxt-AB0002 用这个 这是我在模型中的用户id 我能够生成Alpha数字id,但我不确定如何增加字符

  • 问题内容: 下面的查询生成一行DNA序列 结果-dna CCCGGTTCTCCCCATGCAGG 我想生成10个随机DNA序列 问题答案: 像这样吗?

  • 时间序列可视化生成器 试验特性 时间序列可视化生成器是一个时间序列数据可视化工具,重点在于允许您使用 Elasticsearch 聚合框架的全部功能。时间序列可视化生成器允许您组合无限数量的聚合和管道聚合,以有意义的方式显示复杂的数据。 特色可视化编辑 时间序列可视化构建包含5种不同的可视化类型。您可以使用界面顶部的选项卡式选取器在每种可视化类型之间切换。 时间序列编辑 直方图可视化,支持具有多个

  • 我有以下SQL查询。 我已经使用jpa标准构建器动态构建查询。 ORDER BY子句的表达式#1不在GROUP BY子句中,并且包含非聚合列“COL B”,该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容 我理解在这种模式下,sql验证查询,我的查询失败。如何使用jpa标准生成器创建别名,以便执行的实际语句包含sum列的适当别名? 注

  • 本文向大家介绍python列表生成式与列表生成器的使用,包括了python列表生成式与列表生成器的使用的使用技巧和注意事项,需要的朋友参考一下 列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况 列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如