我试图用这个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 ?
生成id应该很简单,对id使用double会在不必要的地方引入复杂性。Hibernate告诉您不要对id使用double类型,而是使用整数类型(或者UUID或String)。基本上,您希望使用比较简单的东西(对于浮点数,它们不是这样,请参阅这个问题,了解比较有多复杂)。对于浮点数,整数值之间的比较是最直接的,但是如果您不想要小数点后面的数字,为什么要使用浮点数呢?
在映射中选择的类型取决于数据库中使用的类型。如果您查看您的模式,通常id的类型是一个固定的十进制数字,其比例为零(这意味着该数字不能有小数部分),因为简单的整数类型可能不足以满足DBA期望的插入数量。由于它是一个固定的十进制,JDBC将允许将id映射到浮点类型,但这不是您在这里想要的。
固定小数和浮点是两种不同的东西。固定小数意味着你有一个固定的位数,其中精度告诉你小数点前有多少位,比例告诉你小数点后有多少位。浮点意味着使用复杂的二进制表示来表示数字(有一些奇怪的事情发生,比如一些分数的二进制表示导致重复小数被截断),这比id字段需要的要复杂得多。