4

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

我的 Java EE 容器 (JBoss) 中的远程会话 Bean 由客户端通过 RMI 调用。会话 Bean 注入了 JPA 实体管理器,并将某些内容写入数据库。事务由容器 (JTA) 处理。如果在写入数据库时​​发生任何异常,则将此异常抛出给客户端。由于我使用的是 Hibernate,因此客户端中出现了 Hibernate 异常。客户端不知道任何 Hibernate 库,因此我在客户端中收到 ClassNotFoundExceptions。现在我想翻译容器中的异常并抛出我的客户可以处理的异常。我有以下想法,但我认为它们都有一个缺点:

  1. 避免 JPA 异常,例如在写入数据库之前检查约束。这意味着在业务逻辑中复制数据库约束。
  2. 在业务方法中刷新实体管理器,并捕获和翻译在方法内部刷新期间可能引发的任何错误。好吧,我喜欢 Persistence Provider 尽可能长时间地推迟与数据库的任何对话的想法。
  3. 禁用容器管理事务并在我自己的拦截器中进行事务管理。通过这种方式,我可以捕获在提交之前或期间发生的所有异常,并将它们包装到我的应用程序异常中。
  4. 使用 Spring JPA 和 Springs 异常翻译功能。好吧,我已经在 J​​ava EE 容器中,也许有一些 Java EE 方法可以进行异常转换?
4

2 回答 2

0

You could also try-catch org.hibernate.HibernateException in all methods that can be called directly by the client and re-throw another Exception

于 2013-11-14T10:26:24.470 回答
0

My advice is to give the Hibernate libraries to the client, and tell the client not to use them (except for debugging).

This is an example of the well known complaint that exceptions break encapsulation.

于 2013-11-14T10:16:31.370 回答