java - 在 Hibernate 中检索使用 BigInteger 映射的属性时出现问题

标签 java hibernate grails

我遇到了有关使用 Hibernate 检索 10^18 位数字的问题。尽管我不完全确定这是否完全是 Oracle 数据库、Grails、Hibernate 或 Java 问题。考虑这个 Grails 域类:

class Payment {
    BigInteger id
    BigDecimal amount

    static mapping = {        
        id generator: "assigned"
        version false
    }
}

我在检索时遇到了这个问题:

Payment savePayment() {
    BigInteger id = 201910151421550246D
    BigDecimal amount = 100.00G

    Payment payment = new Payment()

    payment.id = id
    payment.amount amount

    payment.save(flush: true)

    Payment retrievedPayment = Payment.findById(id)

    println "payment.id: " + payment.id
    println "payment.amount: " + payment.amount
    println "retrievedPayment.id: " + retrievedPayment.id
    println "retrievedPayment.amount: " + retrievedPayment.amount

    // payment.id: 201910151421550246
    // payment.amount: 100.00
    // retrievedPayment.id: 201910151421550240
    // retrievedPayment.amount: 100.00

    return retrievedPayment
}

我在保存之前指定了 201910151421550246 作为 id,并且还确认了它的值是否与数据库中的值相同。确实如此。此外,当我尝试使用该 id 检索所述记录时,我仍然可以检索相同的 Payment 记录。问题是为什么数值会相差六分呢?目前,我将其映射到 String 数据类型,并在需要执行数值运算时将其转换为 BigInteger,作为临时解决方案。

最佳答案

这不是Oracle数据库或Java BigInteger或hibernate的问题,因为它们支持超过201910151421550246个数字。

在网络应用程序的上下文中,大于 Number.MAX_SAFE_INTEGER 的值对于浏览器来说被认为不可靠。

就像我们打印console.log(201910151421550246);在 JavaScript 中,我们得到 201910151421550240 作为输出。

所以,如果你想使用大于Number.MAX_SAFE_INTEGER的数字,那么将其转换为String然后使用它。

关于java - 在 Hibernate 中检索使用 BigInteger 映射的属性时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518840/

相关文章:

java - 在 Servlet 3.0 HttpServletRequest#login() 身份验证后重定向到 protected 资源或原始/保存的请求?

java - Java中的反向HashMap键和值

java - Android - 在游戏中组织关卡

java - 我没有在 Tomcat 中的 Web 应用程序的线程中获取 Hibernate session

java - 一个只有静态数据和访问这些数据的方法的类。如何正确实现?

hibernate - 发生异常后如何从 `don' 恢复 t 刷新 session `错误?

java - org.hibernate.MappingException : Could not determine type for:

grails - 定制脚手架

spring - 在单个grails应用程序上有多个域,而在第二个域上只能访问一个特定的 Controller ?

java - 如果我更改 grails 域中的字段名称会怎样?