我正在使用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(或任何与数据库相关的异常)异常没有被捕获。
任何帮助表示感谢。
答案 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());
}
}