无法找出需要进行异常舍入的原因

问题描述 投票:0回答:2

我正在编写下面的代码,将我从 db 选择的 bigDecimal 转换为 bigInteger。但是,我遇到了一个异常,可以在下面看到它以及代码。任何人都可以通过它并指导我谢谢

IntegrationsUtils.logMessage(Level.INFO, "WT Refund | Processing Transaction: " + id);

BigInteger bigIntegerId = id.setScale(0, RoundingMode.DOWN).toBigInteger();

WTRefund wtRefundTransaction = getDaoFactory().getWtRefundDao()
.findById(id.toBigInteger());

对于上述代码,我收到以下错误,任何人都可以指导导致此错误的原因吗?这里id的值为db中的154。此外,我还尝试了第二行代码,但它也给出了相同的错误。任何指导都意义重大。

java.lang.ArithmeticException: Rounding necessary
    at java.base/java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4717)
    at java.base/java.math.BigDecimal.needIncrement(BigDecimal.java:4767)
    at java.base/java.math.BigDecimal.divideAndRound(BigDecimal.java:4681)
    at java.base/java.math.BigDecimal.setScale(BigDecimal.java:2940)
    at java.base/java.math.BigDecimal.toBigIntegerExact(BigDecimal.java:3557)
    at org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.wrap(BigIntegerTypeDescriptor.java:88)
    at org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.wrap(BigIntegerTypeDescriptor.java:19)
    at org.hibernate.type.descriptor.sql.DecimalTypeDescriptor$2.doExtract(DecimalTypeDescriptor.java:63)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:329)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3214)
    at org.hibernate.persister.entity.Loadable.hydrate(Loadable.java:94)
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.loadFromResultSet(EntityReferenceInitializerImpl.java:342)
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.hydrateEntityState(EntityReferenceInitializerImpl.java:269)
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:80)
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:288)
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractRows(ResultSetProcessorImpl.java:157)
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:94)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:105)
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:285)
    at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4521)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4511)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:571)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:539)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:327)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118)
    at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1231)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1220)
    at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:202)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2835)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2812)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2768)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2812)
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3400)
    at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3362)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311)
    at jdk.proxy2/jdk.proxy2.$Proxy117.find(Unknown Source)
    at com.tlx.afx.integrations.commons.persistence.dao.BaseDAOPrimary.findById(BaseDAOPrimary.java:96)
    at com.tlx.afx.integrations.commons.persistence.dao.BaseDAOPrimary$$FastClassBySpringCGLIB$$486dd08b.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
    at com.tlx.afx.integrations.commons.persistence.dao.WTRefundDao$$EnhancerBySpringCGLIB$$a3538153.findById(<generated>)
    at com.tlx.afx.integrations.inbound.accountingentries.wtrefund.WTRefundService.listenForWTRefundTransactions(WTRefundService.java:65)
    at com.tlx.afx.integrations.inbound.accountingentries.AccountingEntriesJobsTrigger.listenForIncomingTransaction15(AccountingEntriesJobsTrigger.java:418)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:95)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:842)

更新:

        BigInteger bigIntegerId = id.setScale(0, RoundingMode.DOWN).toBigInteger();

        WTRefund wtRefundTransaction = getDaoFactory().getWtRefundDao().findById(bigIntegerId);

上面的代码仍然给出同样的错误。

java database spring-boot hibernate exception
2个回答
1
投票

发生错误是因为 Hibernate 在 BigInteger 类上调用此方法:

public BigInteger toBigIntegerExact() {
    // round to an integer, with Exception if decimal part non-0
    return this.setScale(0, ROUND_UNNECESSARY).inflated();
}

注意有关异常的评论 - 这就是您所看到的。本质上,问题在于 Hibernate 试图将 BigDecimal 值转换为 BigInteger 值,但 BigDecimal 的小数部分非零,因此失败。

简而言之,它试图将带有小数部分的十进制值(例如 1.2)转换为精确的整数值(即不进行四舍五入),但这是无法完成的。

Hibernate 究竟为何尝试执行此操作取决于数据库表架构和目标类 (WTRefund),而您尚未提供这些。


0
投票

id.setScale(0, RoundingMode.DOWN).toBigInteger()
方法上添加
findById
应该可以解决问题。

或者实际上使用 findById 中的

bigIntegerId

© www.soinside.com 2019 - 2024. All rights reserved.