From b0b1116f4b605e04dfc3c63cd6f5d40be7046919 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Thu, 31 Mar 2011 12:07:30 +0000 Subject: [PATCH] Propagate wrapped exception in SessionFactoryUtils Improve stack traces in certain Hibernate failure cases by properly chaining the cause exception. Issue: SPR-7933 --- .../orm/hibernate3/SessionFactoryUtils.java | 2 +- .../orm/jpa/EntityManagerFactoryUtils.java | 2 +- .../IncorrectResultSizeDataAccessException.java | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java b/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java index cd6be8810ef..ab6042cc206 100644 --- a/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java +++ b/org.springframework.orm/src/main/java/org/springframework/orm/hibernate3/SessionFactoryUtils.java @@ -666,7 +666,7 @@ public abstract class SessionFactoryUtils { return new HibernateObjectRetrievalFailureException((WrongClassException) ex); } if (ex instanceof NonUniqueResultException) { - return new IncorrectResultSizeDataAccessException(ex.getMessage(), 1); + return new IncorrectResultSizeDataAccessException(ex.getMessage(), 1, ex); } if (ex instanceof StaleObjectStateException) { return new HibernateOptimisticLockingFailureException((StaleObjectStateException) ex); diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java index ecaca5890f2..16c8d2c02e1 100644 --- a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java +++ b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java @@ -294,7 +294,7 @@ public abstract class EntityManagerFactoryUtils { return new EmptyResultDataAccessException(ex.getMessage(), 1); } if (ex instanceof NonUniqueResultException) { - return new IncorrectResultSizeDataAccessException(ex.getMessage(), 1); + return new IncorrectResultSizeDataAccessException(ex.getMessage(), 1, ex); } if (ex instanceof OptimisticLockException) { return new JpaOptimisticLockingFailureException((OptimisticLockException) ex); diff --git a/org.springframework.transaction/src/main/java/org/springframework/dao/IncorrectResultSizeDataAccessException.java b/org.springframework.transaction/src/main/java/org/springframework/dao/IncorrectResultSizeDataAccessException.java index 8452d4eecac..f2af289b972 100644 --- a/org.springframework.transaction/src/main/java/org/springframework/dao/IncorrectResultSizeDataAccessException.java +++ b/org.springframework.transaction/src/main/java/org/springframework/dao/IncorrectResultSizeDataAccessException.java @@ -21,9 +21,11 @@ package org.springframework.dao; * for example when expecting a single row but getting 0 or more than 1 rows. * * @author Juergen Hoeller + * @author Chris Beams * @since 1.0.2 * @see EmptyResultDataAccessException */ +@SuppressWarnings("serial") public class IncorrectResultSizeDataAccessException extends DataRetrievalFailureException { private int expectedSize; @@ -63,6 +65,18 @@ public class IncorrectResultSizeDataAccessException extends DataRetrievalFailure this.actualSize = -1; } + /** + * Constructor for IncorrectResultSizeDataAccessException. + * @param msg the detail message + * @param ex the wrapped exception + * @param expectedSize the expected result size + */ + public IncorrectResultSizeDataAccessException(String msg, int expectedSize, Throwable ex) { + super(msg, ex); + this.expectedSize = expectedSize; + this.actualSize = -1; + } + /** * Constructor for IncorrectResultSizeDataAccessException. * @param msg the detail message