EJB和持久性异常

vde*_*ris 3 java hibernate ejb java-ee

通过使用Java EE,我定义了一个持久层,该公开了服务级DAO(扩展GenericDAO并通过将Hibernate用作ORM)。

然后,我注入了一个小细节的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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想通过尝试编写条目重复来测试异常。如预期的那样,该应用程序返回一个错误,但它不是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
Run Code Online (Sandbox Code Playgroud)

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

kos*_*tja 6

您可以EJBException使用并解开它exception.getCause();来决定进一步的策略。

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

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

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