我们有一些遗留代码可以在一种环境中运行,而不能在另一种环境中运行。有问题的块是:
String hql = "from UsrOrgLvlAsgnT where usrAccountT.usrId = ? ";
List<UsrOrgLvlAsgnT> result= getHibernateTemplate().find(hql,usrId);
return result;
日志似乎表明正在运行两个 SQL 调用,首先运行获取主记录 (UsrOrgLvlAsgnT) 并且我认为成功,但随后运行获取详细记录的第二个调用,并且似乎发出错误。
问题 1 - 这不应该是急于获取。HBM 如下:
<hibernate-mapping>
<class name="gov.usdoj.afms.umc.hibernate.model.UsrOrgLvlAsgnT" table="USR_ORG_LVL_ASGN_T" schema="UMC" dynamic-update="true">
<id name="usrAsgnId" type="int">
<column name="USR_ASGN_ID" />
<generator class="identity" />
</id>
<many-to-one name="usrAccountT" class="gov.usdoj.afms.umc.hibernate.model.UsrAccountT" fetch="select" cascade="save-update">
<column name="USR_ID" length="60" not-null="true" />
</many-to-one>
<many-to-one name="structureL" class="gov.usdoj.afms.umc.hibernate.model.StructureL" update="true" insert="true" fetch="select" cascade="save-update">
<column name="STRUCTURE_CD" length="2" not-null="true" />
</many-to-one>
<many-to-one name="orgLvl1L" class="gov.usdoj.afms.umc.hibernate.model.OrgLvl1L" update="false" insert="false" fetch="select" not-found="ignore" not-null="false" cascade="save-update">
<column name="STRUCTURE_CD" length="2" not-null="true" />
<column name="ORG_LVL1_CD" length="5" />
</many-to-one>
<many-to-one name="orgLvl2L" class="gov.usdoj.afms.umc.hibernate.model.OrgLvl2L" update="false" insert="false" fetch="select" not-found="ignore" not-null="false" cascade="save-update">
<column name="STRUCTURE_CD" length="2" not-null="true" />
<column name="ORG_LVL1_CD" length="5" />
<column name="ORG_LVL2_CD" length="6" />
</many-to-one>
<many-to-one name="orgLvl3L" class="gov.usdoj.afms.umc.hibernate.model.OrgLvl3L" update="false" insert="false" fetch="select" not-found="ignore" not-null="false" cascade="save-update">
<column name="STRUCTURE_CD" length="2" not-null="true" />
<column name="ORG_LVL1_CD" length="5" />
<column name="ORG_LVL2_CD" length="6" />
<column name="ORG_LVL3_CD" length="12" />
</many-to-one>
<many-to-one name="orgLvl4L" class="gov.usdoj.afms.umc.hibernate.model.OrgLvl4L" update="false" insert="false" fetch="select" not-found="ignore" not-null="false" cascade="save-update">
<column name="STRUCTURE_CD" length="2" not-null="true" />
<column name="ORG_LVL1_CD" length="5" />
<column name="ORG_LVL2_CD" length="6" />
<column name="ORG_LVL3_CD" length="12" />
<column name="ORG_LVL4_CD" length="6" />
</many-to-one>
<property name="updtTmstmp" type="timestamp" generated="always">
<column name="UPDT_TMSTMP" length="26" not-null="true" />
</property>
<property name="dfltOrgLvl" type="java.lang.Character">
<column name="DFLT_ORG_LVL" length="1" />
</property>
</class>
</hibernate-mapping>
问题 2 - 这种 FK 关系是遗留交易,我们之前的人们使用空白作为空值。我不知道为什么。但我现在无法真正改变它。有没有办法让 hibernate 处理这种空的关系而不会炸毁?
例外:
[10/15/13 10:17:12:897 EDT] 0000002e SystemOut O ERROR [WebContainer : 7] (St60Servlet.java:82) - Error in St60. Process will not continue:
java.lang.RuntimeException: org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException: No row with the given identifier exists: [gov.usdoj.afms.umc.hibernate.model.OrgLvl2L#gov.usdoj.afms.umc.hibernate.model.OrgLvl2LId@3d4ed6f3]; nested exception is org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [gov.usdoj.afms.umc.hibernate.model.OrgLvl2L#gov.usdoj.afms.umc.hibernate.model.OrgLvl2LId@3d4ed6f3]
at gov.usdoj.afms.umc.services.St60Service.fetchOU(St60Service.java:373)
at gov.usdoj.afms.umc.services.St60Service.buildOU(St60Service.java:325)
at gov.usdoj.afms.umc.services.St60Service.verifyUserGroups(St60Service.java:178)
at gov.usdoj.afms.umc.services.St60Service.verifyUpdate(St60Service.java:64)
at gov.usdoj.afms.umc.services.St60Service$$FastClassByCGLIB$$7efbe043.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
at gov.usdoj.afms.umc.services.St60Service$$EnhancerByCGLIB$$d08c239.verifyUpdate(<generated>)
at gov.usdoj.afms.umc.St60.St60Servlet.doGet(St60Servlet.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1536)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1470)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
at gov.usdoj.afms.umc.utils.hibernate.DBParameterFilter.doFilter(DBParameterFilter.java:46)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:363)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:858)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:824)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3742)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:929)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:178)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:272)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture$1.run(AsyncChannelFuture.java:205)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550)
Caused by:
org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException: No row with the given identifier exists: [gov.usdoj.afms.umc.hibernate.model.OrgLvl2L#gov.usdoj.afms.umc.hibernate.model.OrgLvl2LId@3d4ed6f3]; nested exception is org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [gov.usdoj.afms.umc.hibernate.model.OrgLvl2L#gov.usdoj.afms.umc.hibernate.model.OrgLvl2LId@3d4ed6f3]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:663)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:908)
at gov.usdoj.afms.umc.hibernate.dao.HibernateAccountInfoDaoImpl.fetchUsrOrgLvlAsgnById(HibernateAccountInfoDaoImpl.java:144)
at sun.reflect.GeneratedMethodAccessor914.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:599)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
at $Proxy70.fetchUsrOrgLvlAsgnById(Unknown Source)
at gov.usdoj.afms.umc.services.St60Service.fetchOU(St60Service.java:360)
... 50 more
Caused by:
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [gov.usdoj.afms.umc.hibernate.model.OrgLvl2L#gov.usdoj.afms.umc.hibernate.model.OrgLvl2LId@3d4ed6f3]
at org.hibernate.impl.SessionFactoryImpl$2.handleEntityNotFound(SessionFactoryImpl.java:447)
at org.hibernate.event.def.DefaultLoadEventListener.returnNarrowedProxy(DefaultLoadEventListener.java:320)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:277)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1080)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1028)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:623)
at org.hibernate.type.EntityType.resolve(EntityType.java:431)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:140)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898)
at org.hibernate.loader.Loader.doQuery(Loader.java:773)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2294)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
at org.hibernate.loader.Loader.list(Loader.java:2167)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:921)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
... 61 more