Manejo de excepciones de Spring Hibernate

En un proyecto Spring + Hibernate + JTA, estoy tratando de que funcione el manejo de excepciones. Para el siguiente código:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public HandsetManufacturer createHandsetManufacturer(
        HandsetManufacturer handsetManufacturer)
        throws HandsetManufacturerAlreadyExistsException{
    HandsetManufacturer handsetManufacturer2=new  HandsetManufacturer();
    try {

            handsetManufacturerDao.findByUniqueProperty(
                HandsetManufacturer.class, NAME_PROPERTY,
                handsetManufacturer.getName());
        throw new HandsetManufacturerAlreadyExistsException();
    } catch (BusinessObjectNotFoundException ignoreMe) {
    }
    //handsetManufacturer2= handsetManufacturerDao.create(handsetManufacturer);

    try{
        handsetManufacturer2= handsetManufacturerDao.create(handsetManufacturer);
    }catch (JDBCException e) {
        System.out.println("::HibernateException::"+e.getSQL());
        System.out.println("::HibernateException::"+e.getErrorCode());
        System.out.println("::HibernateException::"+e.getSQLState());
        System.out.println("::HibernateException::"+e.getSQLException());
        System.out.println("::HibernateException::"+e.getMessage());
        System.out.println("::HibernateException::"+e.getCause());
        throw new TechnicalException(e);
    }

    return handsetManufacturer2;
}

Estoy tratando de detectar las excepciones subyacentes de hibernate/jdbc/db (por ejemplo, cuando las entidades dependientes aún están presentes, la eliminación fallará con una excepción org.springframework.orm.hibernate3.HibernateJdbcException) y realizar algunas acciones. Sin embargo, el código catch nunca se alcanza.

Pero si elimino "@Transactional (propagación = Propagación. REQUERIDO, aislamiento = Aislamiento. PREDETERMINADO)" de mi método, alcanzará el bloque de captura. Supongo que esto tiene que ver con la forma en que Spring maneja esto, pero no sé cómo puedo detectar excepciones durante JDBCException y también usar la anotación @Transaction

Cualquier ayuda es apreciada!

preguntado el 12 de junio de 12 a las 15:06

1 Respuestas

Supongo que su DAO también está configurado para tener transacciones con propagación REQUERIDA. En Hibernate, hay muchas acciones retrasadas hasta que se vacía la sesión. Uno de los momentos en que ocurrirá el vaciado es antes de la confirmación de la transacción. Eso significa que si su método (supongo que es un método en algún servicio) tiene una transacción a su alrededor, Hibernate persiste o guarda las acciones en su DAO create () en realidad no van a la base de datos hasta que finalice su método de servicio.

Una solución es realizar explícitamente una descarga de sesión () (puede considerar colocar el create () de DAO), de modo que active la actualización de la base de datos y, por lo tanto, cause la excepción que espera que se produzca.

Respondido 22 Abr '13, 05:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.