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

JavaEE容器中的JPA异常翻译

慕阳伯
2023-03-14

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

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

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

共有2个答案

颛孙嘉玉
2023-03-14

您还可以尝试在客户端可以直接调用的所有方法中捕获org.hibernate.HibernateException并重新抛出另一个异常

马国源
2023-03-14

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

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

 类似资料:
  • 我对javaee/EJB比较陌生,我已经读了很多关于javaee容器的书。我有使用web容器(JBoss中的WAR文件)的经验。我还知道JBoss也可以用作JavaEE容器。 JavaEE容器和Web容器之间的区别是什么? 我知道JavaEE也能够包含一个。战争档案。它们不同吗?它们的区别是什么?是否有特定于供应商的偏好,哪一个更好?

  • 我正在开发一个具有DAO、服务、控制器和视图层的Spring web应用程序。JPA用于数据库访问。我用于JPA异常处理的方法如下所示。 我想在异常中获得更多信息,这就是创建自定义DBException的原因,也不想将PersistenceException传播到其他层。 我正在捕获并重新抛出。由于是一个,我认为spring事务在发生异常时应该回滚? 多谢了。

  • 标记类: 编辑:正在添加ProductTags。类 根据getSingleResult的API规范,只应抛出以下异常: null 我知道编写getSingleResultOrNull方法的另一种方法,但在这种情况下我没有发现问题。 对此我们非常感谢您的帮助。

  • nexr@Entity公共类产品{ 错误:

  • 在从DB表检索记录时,我们得到了异常。我在另一张桌子上也做了同样的尝试,它起作用了,但在这张桌子上,它不起作用了。我使用的是 在这里,我创建了一个具有 get 映射的 Controller 类 我收到此异常 SEVERE:Servlet.service()的servlet[调度服务器]在上下文中与路径[]抛出异常(请求处理失败;嵌套异常org.springframework.core.conver