使用JPA在Spring项目的DAO层中进行异常处理

时间:2014-07-11 16:21:18

标签: spring-mvc jpa exception-handling

我正在使用Spring& JPA与Hiberate作为供应商。

在DAO层我试图坚持实体。如果存在重复,则抛出Hibernate的ConstraintViolationException。我在DAO中编写了try-catch来捕获异常,但它根本没有捕获块并将异常抛出到服务层。 JPA是否允许在DAO层中捕获JDBCException,或者它直接将它扔到上层?

我的代码如下所示:

public void saveEntity(SomeEntity entity) throws CustomException {
   try {
      ... do something...
      entityManager.persist(entity);
    }catch(Exception e) {
      throw new CustomException(e.getMessage());
    }
}

这里如果在持续存在之前发生了某些事情,它会捕获,但如果出现问题而持久化并且JDBCException出现则不会。

我知道我可以通过首先检查是否存在记录来避免这种情况,如果不存在,那么我才会保存。但我想知道为什么JDBCException(或任何与数据库相关的异常)异常没有被捕获。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

我找到了原因。

DAO类中的catch块无法捕获异常,因为事务提交在方法执行后发生,所以我放置@Transactional(服务层方法)的方法正在捕获异常。

如果我在持久化后立即使用flush(),它会尝试在那里提交并抛出将被捕获的异常。

public void saveEntity(SomeEntity entity) throws CustomException {
   try {
      ... do something...
      entityManager.persist(entity);
      entityManager.flush(); //tries to commit here & throws ConstraintViolationException    if already exists
    }catch(Exception e) {
      throw new CustomException(e.getMessage());
    }
}