为什么Spring在Hibernate抛出ObjectNotFoundException异常时不抛出DataAccessException?

问题描述:

为什么没有Spring 3.0.4HibernateTemplate方法load()DataAccessException或更具体地说,ObjectRetrievalFailureException,如果Hibernate 3.3.2GA抛出ObjectNotFoundException为什么Spring在Hibernate抛出ObjectNotFoundException异常时不抛出DataAccessException?

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] 

异常正记录,不一定抛出。你看到的是一个日志到异常堆栈跟踪的信息级别,由休眠完成。如果您查看DefaultLoadEventListener的源代码(源代码版本中的第134行),您会注意到它会记录异常并重新引发。

我们在这里看到的是异常堆栈跟踪的日志 - 这里没有证据表明spring没有改变异常。

+0

迈克尔,你是对的!我没有注意到它是生成这个日志消息的Hibernate。我误解了日志条目意味着Spring事实上并没有翻译这个异常。事实上,应用程序没有传播这个异常的任何更高的堆栈应该提示我,因为Spring正确处理了这个异常。 – 2010-12-15 21:57:06

org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException()方法确实检查异常是否为net.sf.hibernate.ObjectNotFoundException。这意味着它应该抛出一个UncategorizedDataAccessException

我不知道这是一个设计决定还是一个错误(即春天的错误)。

+0

Spring将'ObjectNotFoundException'转换为'ObjectRetrievalFailureException'。 – 2010-12-16 15:19:01