Hibernate javaee容器中的JPA异常转换

Hibernate javaee容器中的JPA异常转换,hibernate,jakarta-ee,jpa,jta,Hibernate,Jakarta Ee,Jpa,Jta,有没有一种简单的方法可以将JPA异常转换为应用程序异常 客户端通过RMI调用JavaEE容器(JBoss)中的远程会话Bean。会话Bean被注入一个JPA实体管理器,并且正在向数据库中写入一些内容。事务由容器(JTA)处理。如果在写入数据库时发生任何异常,则会将该异常抛出到客户端。因为我使用Hibernate,所以客户端中出现了Hibernate异常。客户机不知道任何Hibernate LIB,因此我在客户机中得到ClassNotFoundExceptions。现在,我想转换容器中的异常,并抛

有没有一种简单的方法可以将JPA异常转换为应用程序异常

客户端通过RMI调用JavaEE容器(JBoss)中的远程会话Bean。会话Bean被注入一个JPA实体管理器,并且正在向数据库中写入一些内容。事务由容器(JTA)处理。如果在写入数据库时发生任何异常,则会将该异常抛出到客户端。因为我使用Hibernate,所以客户端中出现了Hibernate异常。客户机不知道任何Hibernate LIB,因此我在客户机中得到ClassNotFoundExceptions。现在,我想转换容器中的异常,并抛出一个我的客户机可以处理的异常。我有以下想法,但我认为它们都有缺点:

  • 避免JPA异常,例如在写入数据库之前检查约束。这意味着在业务逻辑中复制DB约束
  • 在业务方法内部刷新实体管理器,并捕获和转换在方法内部刷新期间可能引发的任何错误。我喜欢持久性提供者尽可能长时间地推迟与数据库的任何对话
  • 禁用容器管理的事务并在我自己的拦截器中执行事务管理。通过这种方式,我可以捕获提交之前或提交期间发生的所有异常,并将它们包装到我的应用程序异常中
  • 使用Spring JPA和Spring异常转换功能。我已经在一个JavaEE容器中了,也许有一些JavaEE方法可以进行异常转换

  • 我的建议是将Hibernate库提供给客户端,并告诉客户端不要使用它们(调试除外)


    这是一个众所周知的抱怨异常破坏了封装的例子。

    您也可以尝试在客户端可以直接调用的所有方法中捕获
    org.hibernate.HibernateException
    ,然后重新抛出另一个异常,我不能在服务器端使用try-catch,因为事务是由JEE容器管理的,并且我不能捕获在业务逻辑之外抛出的任何异常。我可以在客户端捕获Hibernate异常,但这意味着向客户端提供Hibernate和数据库驱动程序库。