2010-12-15 13 views
4

Warum nicht Spring 3.0.4HibernateTemplate Methode load() throw DataAccessException oder genauer gesagt, ObjectRetrievalFailureException, in dem Fall, dass Hibernate 3.3.2GAObjectNotFoundException wirft?Warum wirft Spring keine DataAccessException, wenn Hibernate ObjectNotFoundException auslöst?

2010-12-15 13:16:03,939 133247782 [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'] INFO org.hibernate.event.def.DefaultLoadEventListener - Error performing load command 
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.db.spgit.abstrack.model.ConsUsCustomMark#78445AAD8] 
    at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:375) ~[hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:145) ~[hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:179) ~[hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103) ~[hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878) [hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:795) [hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:788) [hibernate-3.2.1.ga.jar:3.2.1.ga] 
    at org.springframework.orm.hibernate3.HibernateTemplate$3.doInHibernate(HibernateTemplate.java:558) [spring-orm-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) [spring-orm-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) [spring-orm-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.orm.hibernate3.HibernateTemplate.load(HibernateTemplate.java:551) [spring-orm-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.orm.hibernate3.HibernateTemplate.load(HibernateTemplate.java:545) [spring-orm-3.0.4.RELEASE.jar:3.0.4.RELEASE] 

Antwort

4

Die Ausnahme protokolliert wird, nicht unbedingt geworfen. Was Sie dort sehen, ist ein Protokoll zum Info-Level des Exception-Stack-Trace, der von Hibernate ausgeführt wird. Wenn Sie sich den Quellcode von DefaultLoadEventListener ansehen (Zeile 134 in meiner Version der Quelle), werden Sie feststellen, dass er die Ausnahme protokolliert und dann erneut ausführt.

Alles, was wir hier sehen, ist ein Protokoll der Ausnahme Stack-Trace - es gibt keine Beweise hier, dass Frühling die Ausnahme nicht transformiert.

+0

Michael, du hast Recht! Ich hatte nicht bemerkt, dass es Hibernate war, der diese Protokollnachricht generiert hatte. Ich habe den Log-Eintrag falsch interpretiert, um zu bedeuten, dass Spring die Ausnahme nicht übersetzt hat, obwohl sie tatsächlich stattgefunden hat. Die Tatsache, dass die Anwendung diese Ausnahme nicht weiter oben auf dem Stack propagiert hatte, hätte mich in diesem Frühjahr darauf hinweisen sollen, dass sie diese Ausnahme korrekt behandelte. –

0

Die Methode org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException() überprüft, ob die Ausnahme net.sf.hibernate.ObjectNotFoundException ist. Dies bedeutet, dass es eine UncategorizedDataAccessException werfen sollte.

Ich weiß nicht, ob dies eine Designentscheidung oder ein Überbau (d. H. Ein Bug im Frühjahr) ist.

+0

Spring übersetzt "ObjectNotFoundException" in "ObjectRetrievalFailureException". –

Verwandte Themen