我正在使用JPA,Hibernate作为提供程序,并使用容器管理的事务(JBoss AS 6.1.0.Final)。
我尝试实现一些细粒度的异常处理,因为我的应用程序有一个特定的异常层次结构,所以我可以定义在每种情况下该怎么做。因此,我已经调查了几个小时,发现文档模糊不清,示例有些简陋,因为异常处理总是被省略“为了清晰起见”,或者是一个简单的try-catch块来处理Exception e。
例如,看看这段代码:
public void deleteCompany(ICompany company) throws MyException1, MyException2 {
if(entityManager != null){
if(company !=null) {
try {
ICompany companyReference= entityManager.getReference(Company.class, company.getId());
entityManager.remove(managedCompany);
entityManager.flush();
} catch(EntityNotFoundException companyDoesNotExist) {
//Wrap & Throw
}
} else {
throw new MyException1("An error occurred while attempting to save a null instance of a company");
}
} else {
throw new MyException2("The entity manager instance is null");
}
}
捕获块为空,因为我卡在这里了……我不知道应该捕获哪个异常来警告系统用户试图删除不存在的记录。
我的具体问题是:我能在那个catch块中捕获Hibernate异常吗?还是必须捕获JPA异常?我找到了一些来源声称JPA包装提供程序的异常,但这对我来说听起来很奇怪。我还发现调用flush()方法可以捕获数据库访问和操作异常,因为事务由容器管理,因此提交在调用deleteCompany之后进一步进行。
谢谢。
编辑:我使用@ApplicationException(rollback=true)注释标记自己捕获的异常,以便再次抛出并更清晰地处理它们。
编辑2:我已更新我的代码。删除公司之前的合并会使公司在数据库中不存在,则每次删除都成功。现在正在测试在不同情况下捕获JPA异常的行为建议。
编辑3:现在它正常工作了!结果错误部分在于我的代码,因为那个合并调用。首先获取引用,然后尝试删除即可完成此操作,这样我就能够捕获EntityNotFoundException,将其包装并再次抛出。
cause
),但出于几个原因,这不是一个好主意。1)你不应该关心供应商,你希望能够随意更改供应商而不更改代码。2)供应商实现并不总是有很好的文档记录,因此尝试确定完整的异常集可能是徒劳的练习。 - Perception