[hibernate-issues] [Hibernate-JIRA] Created: (HHH-7228) Unhelpful exception when decimal field mapped as BigInteger

Craig Ringer (JIRA) noreply at atlassian.com
Thu Apr 5 22:19:48 EDT 2012


Unhelpful exception when decimal field mapped as BigInteger
-----------------------------------------------------------

                 Key: HHH-7228
                 URL: https://hibernate.onjira.com/browse/HHH-7228
             Project: Hibernate ORM
          Issue Type: Bug
          Components: core
    Affects Versions: 4.0.1
         Environment: JBoss AS 7.1.1.Final

java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)

Hibernate 4.0.1 bundled with JBoss AS 7

            Reporter: Craig Ringer
            Priority: Trivial


This is a usability and debuggability issue; the problem code isn't expected to work, it just currently fails in an incredibly unhelpful way.

If a PostgreSQL `NUMERIC' field is mapped as a BigInteger, but it turns out to contain decimal data not just whole integer values, a "java.lang.ArithmeticException: Rounding necessary" exception will percolate up from BigDecimal to the application. There is no indication of which entity or which field was at fault, making it very painful to debug this issue, especially when working with generated model skeletons.

Hibernate should catch this exception and wrap it in a PersistenceException that indicates the entity and field at fault.

I've seen reports that this issue also affects Oracle, which has similar number fields to PostgreSQL.

I'll see if I can put together a test case soon. Here's an example exception showing the (lack of) information about the source of the problem:






java.lang.ArithmeticException: Rounding necessary
	at java.math.BigDecimal.divideAndRound(BigDecimal.java:1452)
	at java.math.BigDecimal.setScale(BigDecimal.java:2402)
	at java.math.BigDecimal.toBigIntegerExact(BigDecimal.java:2940)
	at org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.wrap(BigIntegerTypeDescriptor.java:107)
	at org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.wrap(BigIntegerTypeDescriptor.java:36)
	at org.hibernate.type.descriptor.sql.DecimalTypeDescriptor$2.doExtract(DecimalTypeDescriptor.java:67)
	at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:65)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:269)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:265)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:238)
	at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:357)
	at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2695)
	at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1552)
	at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1484)
	at org.hibernate.loader.Loader.getRow(Loader.java:1384)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:640)
	at org.hibernate.loader.Loader.doQuery(Loader.java:856)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
	at org.hibernate.loader.Loader.loadEntity(Loader.java:2058)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
	at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3697)
	at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:439)
	at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:420)
	at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204)
	at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251)
	at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
	at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:954)
	at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:903)
	at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:610)
	at org.hibernate.type.EntityType.resolve(EntityType.java:438)
	at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:150)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1006)
	at org.hibernate.loader.Loader.doQuery(Loader.java:883)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
	at org.hibernate.loader.Loader.doList(Loader.java:2463)
	at org.hibernate.loader.Loader.doList(Loader.java:2449)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
	at org.hibernate.loader.Loader.list(Loader.java:2274)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196)
	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1115)
	at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252)
	at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getResultList(CriteriaQueryCompiler.java:260)
	at au.com.postnewspapers.nymm.facade.AbstractFacade.findAll(AbstractFacade.java:145)
	at au.com.postnewspapers.nymm.facade.AbstractFacade.findAll(AbstractFacade.java:151)
	at au.com.postnewspapers.nymm.jsf.Customers.getCustomers(Customers.java:22)
	at au.com.postnewspapers.nymm.jsf.Customers$Proxy$_$$_WeldClientProxy.getCustomers(Customers$Proxy$_$$_WeldClientProxy.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
	at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
	at org.richfaces.component.UISequence.getValue(UISequence.java:179)
	at org.richfaces.component.UISequence.createExtendedDataModel(UISequence.java:113)
	at org.richfaces.component.UIDataTableBase.createExtendedDataModel(UIDataTableBase.java:195)
	at org.richfaces.component.UIDataAdaptor.getExtendedDataModel(UIDataAdaptor.java:466)
	at org.richfaces.component.UIDataAdaptor.setRowKey(UIDataAdaptor.java:279)
	at org.richfaces.renderkit.AbstractTableRenderer.encodeTableFacets(AbstractTableRenderer.java:118)
	at org.richfaces.renderkit.DataTableRenderer.doEncodeBegin(DataTableRenderer.java:303)
	at org.richfaces.renderkit.RendererBase.encodeBegin(RendererBase.java:115)
	at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1777)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
	at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
	at org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
	at org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
	at java.lang.Thread.run(Thread.java:722)


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list