我正在使用 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 中工作正常。
现在,当我尝试使用休眠插入记录时,它给出以下错误
org.hibernate.id.IdentifierGenerationException:此 id 生成器生成长整型、短整型或字符串
似乎当我的序列返回 Number 时,hibernate 将其视为 BigDecimal,而 hibernate 序列生成器类仅考虑长、整数、短和字符串的值。
Hibernate 不应该有 BigDecimal 的问题。但我认为他们还没有为序列生成器实现 BigDecimal
任何人都可以帮我解决这个问题吗?
Thanks.
老实说,我无法想象为什么你会坚持将 ID 设置为 BigDecimal 而不是 long。最大长值是9,223,372,036,854,775,807
尽管不可否认,它大约是最大 NUMBER(22) 值的千分之一,但实际上应该是足够了。如果你要生成一个million身份标识每一秒,你必须这样做30万年为了耗尽你的序列。
也就是说,为了将标识符生成为 BigDecimal,您需要编写自己的生成器。您可以通过扩展 Hibernate 的内置 SequenceGenerator 并覆盖其来做到这一点generate()
方法。而不是打电话给IdentifierGeneratorFactory.get()
它仅支持 long/int/short/String,您可以从结果集中以 BigDecimal 形式获取序列值。
然后您将需要声明你的生成器 http://docs.jboss.org/hibernate/stable/core/reference/en/html/mapping.html#mapping-declaration-id通过指定其完整的类名:
<generator class="com.mypackage.BigDecimalGenerator">
<param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
</generator>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)