gpt4 book ai didi

hibernate - 使用 JPA + Hibernate 进行异常处理

转载 作者:行者123 更新时间:2023-12-03 12:31:52 25 4
gpt4 key购买 nike

我使用 JPA 和 Hibernate 作为容器管理事务(JBoss AS 6.1.0.Final)的提供者。

我正在尝试实现一些细粒度的异常处理,因为我的应用程序中有一个特定的异常层次结构,因此我可以定义在每种情况下要做什么。所以,我已经研究了几个小时,我发现文档含糊不清,示例有些原始,因为“为了清楚起见”总是忽略异常处理,或者是处理异常 e 的简单 try-catch 块。

例如,拿这个代码:

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 块是空白的,因为那是我被卡住的地方......我不知道我应该捕捉哪个异常来提醒系统用户试图删除不存在的记录。

我的具体问题是:我可以在该 catch 块上捕获 Hibernate 异常还是必须捕获 JPA 异常?我发现一些来源声称 JPA 包装了提供者的异常,但这对我来说听起来很奇怪。我还发现调用flush() 方法可以捕获数据库访问和操作异常,因为事务由容器管理,因此在调用deleteCompany 之后提交会进入进一步的步骤。

谢谢你。

编辑:我正在用我自己用@ApplicationException(rollback=true) 注释的异常包装我捕获的异常,所以我可以再次抛出它们并更清楚地处理它们。

编辑 2:我已经更新了我的代码。如果公司不在数据库中,则删除前的合并会保留公司,从而导致每次删除都成功。现在正在抛出异常,我正在测试它在不同情况下的行为如何按照 Perception 的建议捕获 JPA 异常。

编辑 3:现在它正在工作!,结果错误部分出现在我的代码中,因为那个合并调用。首先获取引用并在完成后尝试删除,这样我就能够捕获 EntityNotFoundException,将其包装并再次抛出。

最佳答案

您绝对不会捕获供应商异常,因为它们会被卷入 JPA 异常中。请注意,您可能会在相关点获得几种异常类型之一:

  • IllegalArgumentException - 对于分离或非实体对象
  • IllegalStateException - 实体管理器已关闭
  • PersistenceException - 至少,它的一些子类。你可以得到
    出于多种原因,如果没有关联交易
    并且调用需要一个,如果数据库约束拒绝
    操作,如果交易时间太长等等等等

  • 您真的不应该在如此低的级别捕获这些异常,除非您计划将它们重新包装在某种自定义应用程序异常中。如果您决定走这条路线,请确保包装原始异常,这样堆栈跟踪就不会丢失。

    值得注意的是,JPA Entity Manager 生成的所有异常都是运行时异常。

    关于hibernate - 使用 JPA + Hibernate 进行异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199552/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com