hibernate无法将ID指定为double

时间:2015-07-09 13:07:22

标签: java hibernate id-generation

我尝试使用此xml

为具有双数据类型的hibernate分配ID
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping >
        <class name="User" table="user">
            <id name="id" type="double"  >
                <column name="id_user" />
                <generator class="increment"  />
            </id>
            <property name="username" />
            <property name="password" />
            <property name="email" />

       </class>
    </hibernate-mapping>

但它给了我错误

org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.Double
    at org.hibernate.id.IdentifierGeneratorHelper.getIntegralDataTypeHolder(IdentifierGeneratorHelper.java:210) at org.hibernate.id.IdentifierGeneratorHelper.getIntegralDataTypeHolder(IdentifierGeneratorHelper.java:210)

我的代码出了什么问题?或者它是Hibernate的bug还是什么?

1 个答案:

答案 0 :(得分:5)

生成id应该很简单,使用id的双精度会在不需要的地方引入复杂性。 Hibernate告诉你不要对id使用double,使用整数类型(或UUID或String)。基本上你想要使用比较简单的东西(它们不是浮点数,请参阅question,了解毛茸茸的比较是多少)。对于浮点数,比较在整数值之间最直接,但如果您不希望小数点后面的数字,为什么使用浮点?

您在映射中选择的类型取决于数据库中使用的类型。如果你看一下你的模式,通常id的类型是一个固定的十进制数字,其标度为零(意味着数字不能有一个小数部分),因为简单的整数类型可能不足以容纳DBA的插入数量预计。因为它是固定的十进制JDBC,所以允许将id映射到浮点类型,但这不是你想要的。

固定小数和浮点数是两回事。固定小数表示您有一个固定的位数,其中precision表示小数点前的位数,scale表示小数点后的位数。浮点意味着使用复杂的二进制表示来表示数字(奇怪的事情发生,例如某些分数的二进制表示导致重复的小数被截断),这比id字段需要的要复杂得多。