Struts報錯ObjectNotFoundException的解決方法

第一種,ObjectNotFoundExceptionhtml

完整錯誤示例以下:java

Struts Problem Report
Struts has detected an unhandled exception: 
Messages:    •  No row with the given identifier exists: [com.ftms.entity.JPositionTown#0] 
File:    org/hibernate/internal/SessionFactoryImpl.java
Line number:    247
________________________________________
Stacktraces
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.ftms.entity.JPositionTown#0] 
    org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:247)
    org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:210)
    org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251)
    org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
    org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079)
    org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006)
    org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613)
    org.hibernate.type.EntityType.resolve(EntityType.java:441)
    org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168)
    org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:134)
    org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:995)
    org.hibernate.loader.Loader.doQuery(Loader.java:874)
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
    org.hibernate.loader.Loader.doList(Loader.java:2438)
    org.hibernate.loader.Loader.doList(Loader.java:2424)
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254)
    org.hibernate.loader.Loader.list(Loader.java:2249)
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248)
    org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    com.ftms.dao.UserDAO.findByProperty(UserDAO.java:112)
    com.ftms.dao.UserDAO.findByUsername(UserDAO.java:120)
    com.ftms.dao.UserDAO$$FastClassByCGLIB$$42997a1e.invoke(<generated>)
    net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
    org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

根據博文:http://www.javashuo.com/article/p-yczevtgr-kk.htmlspring

報錯分析:數據庫

Hibernate 的映射文件,表 A 裏關聯了表 B 的主鍵,當查詢表 A 時,在 B 表裏找不到對應記錄時就會報錯,若是隻是邏輯刪除不會報這種錯誤,只有當表 B 裏測試沒有 JPositionTown爲 0的這條數據了纔會報錯 (已實際測試過);上面報錯信息實體類後面【#0】表示實體類對應表 JPositionTown=0的記錄找不到。也就是存在垃圾數據,多是由於沒有連帶刪除,或者是數據錄入有誤。ide

解決辦法:測試

1. 修改配置文件加上 not-found="ignore" 」fetch

即:spa

<many-to-one name="JPositionTown" class="com.ftms.entity.JPositionTown" fetch="select" cascade="all" lazy="false" not-found="ignore">
<column name="town">
<comment>住址</comment>
</column>
</many-to-one>

2. 要麼就把這條有問題的數據從數據庫刪掉。hibernate

相關文章
相關標籤/搜索