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