有没有一种简单的方法可以将 JPA 异常转换为应用程序异常?
我的 Java EE 容器 (JBoss) 中的远程会话 Bean 由客户端通过 RMI 调用。会话 Bean 注入了 JPA 实体管理器,并将某些内容写入数据库。事务由容器 (JTA) 处理。如果在写入数据库时发生任何异常,则将此异常抛出给客户端。由于我使用的是 Hibernate,因此客户端中出现了 Hibernate 异常。客户端不知道任何 Hibernate 库,因此我在客户端中收到 ClassNotFoundExceptions。现在我想翻译容器中的异常并抛出我的客户可以处理的异常。我有以下想法,但我认为它们都有一个缺点:
- 避免 JPA 异常,例如在写入数据库之前检查约束。这意味着在业务逻辑中复制数据库约束。
- 在业务方法中刷新实体管理器,并捕获和翻译在方法内部刷新期间可能引发的任何错误。好吧,我喜欢 Persistence Provider 尽可能长时间地推迟与数据库的任何对话的想法。
- 禁用容器管理事务并在我自己的拦截器中进行事务管理。通过这种方式,我可以捕获在提交之前或期间发生的所有异常,并将它们包装到我的应用程序异常中。
- 使用 Spring JPA 和 Springs 异常翻译功能。好吧,我已经在 Java EE 容器中,也许有一些 Java EE 方法可以进行异常转换?