通过使用 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/