我正在开发一个应用程序,使用oracle11g、Java(struts2)和休眠状态。

我已经表名为mytemp列mytemp_id它的型号(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.冬眠。身份证。IdentifierGenerationException:这id发电机产生的长期、整数、短期或串

看来,作为我的顺序返回的号码,hibenate考虑到它作为BigDecimal,同时休眠的sequece发生类考虑的价值观,是长期、整数、简短和串只。

休眠不应该有问题BigDecimal.但我觉得他们还没有实现BigDecimal为序列的产生器

任何一个可以帮助我解决问题?

谢谢。

有帮助吗?

解决方案

跟你说实话,我不能想象为什么你会坚持具有您的身份证作为BigDecimal而不是长。最大的长值 9,223,372,036,854,775,807 其中,虽然无可否认的是,约有一千分之一的最大数量(22)的价值,确实应该 很够了.如果你是要产生一个 标识符 每一秒, 你会有这样做的 有300 000多年 为了排你的序列。

这就是说,为了有你的标识生成为BigDecimal你会需要编写自己的发电机。你可以做到这一点的延伸休眠的SequenceGenerator和其压倒一切的 generate() 法。而不是打电话过来 IdentifierGeneratorFactory.get() 只支持长/int/短/String你会得到你的顺序值结果设置为BigDecimal.

然后你会需要 宣布您的发电机 通过指定其完整类名称:

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

其他提示

你设置正确的话?这应该是足以使休眠了解该序列的结果。

[编辑]的问题是,你的序列的类型不匹配的列的类型。序列(按照Hibernate的错误消息)可以转换为长,整数,短或字符串,而你的程序返回一个BigDecimal。

我建议来指定ID列“长”,即使Oracle不知道该类型的类型。在内部,休眠应该然后能够给大家正确地投了一切。

当然。冗长的ID必须是独特的记录可以产生足够的总是考虑数量。仅仅具有特殊值的特定发生器可能比其他的整数型或具有超过对照的整数出于某种原因(可能是特定项目)。类型值

此外,发生器是数据库中的特定样序列对于Oracle,所以dialact定义不做物质也

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top