java - EJB 和持久性异常

标签 java hibernate jakarta-ee ejb

通过使用 Java EE,我定义了一个持久层,它公开了多个 DAO(扩展 GenericDAO 和通过使用 Hibernate 作为 ORM)。

然后,我注入(inject)了一个特定的 DAO,以便在另一个类中使用它。

@Inject
private MyDAO myDAO;

public void writeSomething(String key, String data) {
    try {
        myDAO.create(key, data);
    } catch (ConstraintViolationException e) {
        // BLOCK 1
    } catch (Exception e) {
        // BLOCK 2
    }
}

现在,我想通过尝试编写一个条目副本来测试异常。 正如预期的那样,应用程序返回了一个错误,但它不是 ConstraintViolationException 实例,而是其他东西(实际上是 EJBException)。

11:42:19,065 ERROR [org.jboss.ejb3.invocation] (http-localhost-127.0.0.1-8080-3) JBAS014134: EJB Invocation failed on component MyDAO for method public java.lang.Object my.app.dal.genericdao.GenericDAOImpl.create(java.lang.Object) throws java.lang.IllegalStateException,javax.persistence.PersistenceException,org.hibernate.exception.ConstraintViolationException: javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Duplicate entry

如何根据情况(在这种情况下违反约束)捕获 myDAO 抛出的特定异常?

最佳答案

您可以捕获 EJBException 并使用 exception.getCause(); 解包以决定进一步的策略。

但是,我不会让 DAO 将 PersistenceException 抛出到应用程序中,无论是否包装。它会在不同的抽象级别上使用重复的样板文件污染您的代码,并进行错误处理。

建议在 DAO 内部处理即时故障,如果无法恢复,则抛出以业务为中心的应用程序异常。

对于由于尝试存储重复项而可能违反约束的情况,请考虑先查询重复项,然后在适当的情况下修改和存储查询结果。相反,依赖于捕获 Exceptions 可读性差且效率低。

关于java - EJB 和持久性异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24734054/

相关文章:

java - 使用tomcat绑定(bind)LDAP进行多认证?

Java 输入不匹配异常错误。我该如何解决这个问题?

mysql - 如何在Mysql中单独检查日期和时间?

java - 在java中创建动态函数调用

java - 领先的 EJB 平台提供商有哪些,例如 WebSphere 等?

java - Java EE 应用程序如何在没有任何 main 方法的情况下开始执行以及控制权如何转移到不同的类

java - Glassfish 2.0 Poodle 漏洞 - 如何禁用 SSL 并仅允许 TLS

java - 处理数组的 Java 代码不需要 try catch ArrayIndexOutOfBoundsException 的原因?

java - Spring MVC Hibernate 创建名为 'sessionFactory' 的 bean 时出错

java - 两个不同的对象在 hibernate 中加载