我正在使用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万年的 时间才能耗尽序列。 ***
9,223,372,036,854,775,807
就是说,为了使您的标识符生成为BigDecimal,您将需要编写自己的生成器。您可以通过扩展Hibernate的内置SequenceGenerator并覆盖其generate()方法来实现。无需通过IdentifierGeneratorFactory.get()仅支持long / int / short / String 的调用,您可以从结果集中获取序列值作为BigDecimal。
generate()
IdentifierGeneratorFactory.get()
然后,您需要通过指定生成器的完整类名来声明生成器:
<generator class="com.mypackage.BigDecimalGenerator"> <param name="sequence">MYTEMP_TEMP_ID_SEQ</param> </generator>