【问题标题】:Why does Hibernate map BIGINT to BigInteger为什么 Hibernate 将 BIGINT 映射到 BigInteger
【发布时间】:2015-02-10 07:47:40
【问题描述】:

在大多数数据库中,BIGINT 是一个 64 位整数。有谁知道为什么 Hibernate 将这些映射到 BigInteger 而不是 Long?我可以很好地处理这些,但我只是好奇。

您可以在 Dialect.java 中查看此类型的默认映射。我什至发现了一个休眠问题,但没有 cmets 表明为什么会出现这种情况。

https://hibernate.atlassian.net/browse/HHH-7318

我认为这个选择一定是有原因的,但我在 google 上没有取得任何成功。

另外,子类化我的数据库方言并覆盖它会有什么影响?

谢谢!

【问题讨论】:

    标签: hibernate jpa jdbc


    【解决方案1】:

    很可能是因为BIGINTs 可以是无符号的(in MySQL at least,如果不是在其他 RDBMS 中)。

    唯一可以保存完整范围的 64 位无符号整数的 Java 类型是 BigInteger。为此使用 long 是不正确的,因为这会将 18446744073709551615 (264 - 1) 转换为 -1。

    【讨论】:

    • 是的,但我认为,因为我将方言设置为 PostgreSQL,所以它会映射到 long。有没有办法全局改变这个?
    • 更糟糕的是,它在序列化时映射 Long -> bigint,然后无法从它创建的 DDL 中取回值。我认为这是一个巨大的错误。即使将查询中的标量类型设置为 Long,也会发生这种情况。/
    • 虽然在技术上是正确的,但很多用例不(或永远不会)使用 BIGINT 的全部范围,所以 Long 就足够了。例如,如果地球上有 2^64 - 1 个人,那么我们要担心的问题要比数据库中的下一个 ID 大得多。 ;-) 另见hibernate.atlassian.net/browse/HHH-7318
    猜你喜欢
    • 2013-07-15
    • 2015-12-15
    • 1970-01-01
    • 2016-05-12
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多