2009-08-14 103 views
3

我正在开发一个使用oracle 11g,Java(struts2)和Hibernate的应用程序。Oracle休眠序列生成器问题

我有一个名为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数据库序列。

现在,当我尝试插入记录使用休眠,它给了我下面的错误

org.hibernate.id.IdentifierGenerationException:这个ID发生器长,整数,短期或串

似乎当我的序列返回Number时,hibenate认为它是BigDecimal,而hibernate的sequece生成器类只考虑long,integer,short和string的值。

Hibernate应该没有BigDecimal的问题。但我认为他们还没有实现序列生成器的BigDecimal

任何人都可以帮我解决这个问题吗?

谢谢。

回答

13

说实话,我无法想象为什么你会坚持让你的ID作为BigDecimal而不是长。最大长期价值是9,223,372,036,854,775,807,尽管公认为最大NUMBER(22)值的千分之一,但应该确实是够了。如果您要生成一个百万标识符每秒,您必须为300,000年这样做,以便用尽您的顺序。

也就是说,为了让您的标识符生成为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> 
+1

Hello ChssPly76, 感谢您的回复。 我将hibernate转换为在有休眠时使用序列的BigDecimal。它解决了我的问题。 我在这里发布它知道如何扩展hibernate identifiergenerator类来使用bigDecimal序列生成器。 我不明白。但将BigDecimal转换为long可以肯定地解决问题。 谢谢。 – amar4kintu 2009-08-25 12:31:49

+0

我已经解释了如何在上面的答案中扩展'SequenceGenerator'。看看它的'generate()'方法 - 你基本上会复制整个东西并用'resultSet.get()'替换'IdentifierGeneratorFactory.get()'来获得你的BigDecimal值。 – ChssPly76 2009-08-25 16:16:34

+0

我将我所有的big_decimal字段设置为在我的hibernate生成文件中被占用的时间..所以现在它工作正常..谢谢..对于您的支持.. – amar4kintu 2009-12-29 12:21:43

2

您是否设置了正确的方言?这应该足以让Hibernate理解序列的结果。

[编辑]问题是,你的序列的类型不匹配你的列的类型。序列(按照Hibernate的错误信息)可以转换为long,integer,short或string,而序列返回BigDecimal。

我建议将ID列的类型指定为“long”,即使Oracle不知道该类型。在内部,Hibernate应该能够正确地为每个人提供一切。

+0

是..以下是我的方言 <属性名=“hibernate.dialect”> org.hibernate.dialect.Oracle10gDialect – amar4kintu 2009-08-14 09:18:27

+0

在这种情况下,你的ID列的类型的问题。查看我的编辑。 – 2009-08-14 13:43:52

2

肯定。长ID必须总是考虑它可以生成的唯一记录的数量。特定发生器只是具有特殊值,可能不是整数类型或有控制整数类型值出于某种原因(可能是项目特定的)。

另外,生成器与oracle的序列相似,因此dialact的定义也很重要。