当前位置: 首页 > 知识库问答 >
问题:

使用JPA Hibernate处理异常

皇甫才良
2023-03-14

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

我正在尝试实现一些细粒度的异常处理,因为我的应用程序上有一个特定的异常层次结构,所以我可以定义在任何情况下要做什么。因此,我已经研究了几个小时,发现文档很模糊,示例也有些原始,因为“为了清晰起见”总是忽略异常处理,或者是一个简单的try-catch块,用于处理异常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块是空白的,因为我被卡住了……我不知道应该捕捉哪个异常来警告系统用户试图删除一条不存在的记录。

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

谢谢你。

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

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

编辑3:现在起作用了!,结果是错误部分出在我的代码中,因为那个merge调用。首先获取引用,然后尝试移除,这样我就能够捕获EntityNotFoundException,包装它并再次抛出它。

共有1个答案

翟俊远
2023-03-14

您肯定不会捕获供应商异常,因为它们会被放入JPA异常中。请注意,您可能会收到以下几种异常类型之一:

  • IllegalArgumentException-用于分离或非实体对象
  • 非法状态异常-实体管理器已关闭
  • PersistenceException-至少是其中的一些子类。如果没有关联的事务并且调用需要关联的事务,如果数据库约束拒绝操作,如果事务花费的时间太长,等等,您可以出于多种原因获得此结果

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

值得注意的是,JPA实体管理器生成的所有异常都是运行时异常。

 类似资料:
  • 我们有一个在负载均衡器下运行的web应用程序。两个用户尝试执行相同的操作,例如,两个用户同时发出相同的订单,这会创建重复的订单。 在一个事务提交之前,另一个请求正在检查是否有任何顺序。它正在创建重复的条目。两个请求都试图同时处理。 用户A 我们尝试了以下选项, 将整个管理器锁定,锁定类型为 但是这些选择都没有帮助。 请建议如何进行。 谢啦

  • 问题内容: 我目前正在使用node.js应用程序,并且遇到了通常的异步代码问题。 我正在Node的HTTP模块之上实现服务服务器。 该服务器支持(类似表达)路由。例如,我有如下代码: 服务器需要能够承受故障,当传递给任何函数的问题出现时,我不想使整个服务器崩溃。当我编写如下代码时,会发生问题: 我看不到如何在这里捕获错误。我不想因一个服务器端故障而使服务器崩溃,而是要服务500个。 我能够提出的唯

  • 虽然程序员可以用异常作为程序控制的替代方法,但异常处理应当只用于异常情况,处理程序组件中与这些异常处理没有直接关系的异常,处理函数、库、类等常用软件组件中的异常和组件本身不处理异常的情况,在大型系统中以统一方式处理异常。 编程技巧 13.3 对程序本身很容易处理的简单局部错误使用传统情误处理方法而不用异常处理。 软件工程视点 13.3 涉及库时,库函数调用者通常用特定错误处理方法处理库函数中产生的

  • 我是一个有Spring和Spring靴的新手。在创建了一个简单的REST API来对用户执行CRUD操作之后,我还创建了自定义的异常处理程序来捕获应用程序中发生的任何异常。这是我写的代码 controller类 使用@ControllerAdvice注释的异常处理程序类 但是,当发生任何异常时,应用程序将被重定向到/error page,而不是由异常处理程序类处理。谁能给出正确的方法来做这件事。

  • 我正在尝试进行大量的外部服务调用,每个调用都遵循异常处理和有条件的进一步处理。我认为使用内部的. on完成来扩展这个不错的(Scala中带有期货的异步IO)示例会很容易,但似乎我对范围和/或期货有些不理解。有人能给我指出正确的方向吗? 在我的电脑上(Scala 2.10.4 ),这打印出来: 我要(顺序不重要):

  • 问题内容: 假设我有一个抛出某种Exception的方法。引发异常的代码位于访问外部服务的第三方库中。我有一些课程可以很好地处理外部服务,并且有很多异常处理程序可以处理潜在的问题。我遇到的问题是我可能有很多异常,但是如果有一个动作,并且可能有大量尝试/捕获块,我可能只需要执行几个动作之一。异常的类型甚至可能不相关,或者不同的方法可能会抛出相同类型的异常,但是根据抛出该异常的方法,需要采取不同的操作