oracle hibernate 序列生成器问题

标签 oracle hibernate numbers bigdecimal

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

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

现在,当我尝试使用 hibernate 插入记录时,它给了我以下错误

org.hibernate.id.IdentifierGenerationException: 此 id 生成器生成长、整数、短或字符串

似乎当我的序列返回数字时, hibernate 将其视为 BigDecimal,而 hibernate 的序列生成器类仅考虑长、整数、短和字符串的值。

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。

然后您需要 declare your generator通过指定其完整的类名:

<generator class="com.mypackage.BigDecimalGenerator">
  <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
</generator>

关于oracle hibernate 序列生成器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1276839/

相关文章:

javascript - 使用文字符号丢​​失负数

mysql - DBMS 中最先进的 self 修复和 self 保护

sql - Oracle Apex 5 : Using Multiple Columns in a Bar Charts Axix

mysql - Oracle 与 MySQL 的对比

sql - Oracle SQL - 仅当某个条件为真时才可以连接两个表吗?

java - 奇怪的java.io.NotSerializedException : org. springframework.dao.support.PersistenceExceptionTranslationInterceptor

database - Hibernate 使用新索引更新数据库结构

ruby - 如何使用 Ruby 检查字符串中是否至少包含一个数字?

在 C 上比较字符串和 if

java - 对于现有 Wicket Web 应用程序来说,什么是好的工作流程解决方案?