所有数据库似乎都有关于将各种整数数据类型映射到的Java对象的建议。例如,在DB2中,它是[SMALLINT:java.lang.Short,INTEGER:java.lang.Integer,BIGINT:java.lang.Long]。
在Grails Domain类中对所有这些文件使用java.math.BigInteger是否有问题?它会使输入更简单,类似于十进制方法,其中一切都是java.math.BigDecimal。
为了澄清,我无法控制数据库中的数据类型,并且如果我这样做,则不会主张仅使用一种整数类型来破坏数据模型。我只是建议将所有整数数据类型映射到Grails Domain类中的java.math.BigInteger,如:
class NdIntegerTest {
BigInteger id
BigInteger ndSmallint
BigInteger ndInteger
BigInteger ndBigint
...
}
答案 0 :(得分:6)
有一个原因,以及它在您的数据库中存储数据。例如,如果您有一个用于存储人员年龄的用例,则使用BIGINT
是没有意义的。在某些数据库引擎中,存储BIGINT
会占用比SMALLINT
更多的空间。显然,当你拥有数十亿条记录时,这会产生影响,但是当你有数千条记录时这几乎不重要。
这就是原因。
建议,不使用对您希望存储的数据类型不切合实的数据类型。从长远来看,你会发现你努力使事情变得同质化,从而在长期内产生问题。使用正确的工具来完成正确的工作,使用正确的数据类型来获得正确的数据。
答案 1 :(得分:0)
基于总输入(感谢Joshua),我得出结论,标准化java.math.BigInteger是对Grails Domain类中整数数据类型的合理处理。
我的测试基于类似于帖子中的类,涉及使用DB2的SMALLINT,INTEGER和BIGINT数据类型。我尝试插入和更新行,似乎一切顺利。我在元素中放入的数据多于数据库可以接受的数据,我得到了以下异常(等等)。
org.springframework.dao.InvalidDataAccessResourceUsageException: could not...
at ...
Caused by: org.hibernate.exception.SQLGrammarException: could not...
at ...
Caused by: com.ibm.db2.jcc.a.bn: [jcc][10177][11599][3.51.90] Invalid data conversion: Requested conversion would result in a loss of precision of [value]. ERRORCODE=-4461, SQLSTATE=42815
at ...
将超大值读取到尺寸过小的Domain Class变量FWIW时会发生同样的错误,当变量是BigInteger时,这显然不是问题。