hibernate 无法将 ID 分配为双精度

hibernate cant assign ID as double

我试图用这个 xml

为双数据类型的休眠分配 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 之类的?

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

您在映射中 select 的类型取决于数据库中使用的类型。如果你查看你的模式,通常 id 的类型被指定为一个固定的十进制数字,小数位数为零(这意味着数字不能有小数部分),因为简单的整数类型可能不足以满足 DBA 插入的数量期望。由于它是固定小数 JDBC 将允许将 id 映射到浮点类型,但这不是您想要的。

固定小数和浮点数是两个不同的东西。固定小数意味着您有固定的位数,其中精度告诉您小数点前有多少位,小数位告诉您小数点后有多少位。浮点数意味着使用复杂的二进制表示来表示数字(奇怪的是,某些分数的二进制表示导致重复的小数被截断)比 id 字段需要的要复杂得多。