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
根据情况(在这种情况下违反约束)捕获特定的异常抛出?
您可以EJBException
使用并解开它exception.getCause();
来决定进一步的策略。
但是,PersistenceException
无论是否包装,我都不会让DAO扔到应用程序中。它将使用重复的样板污染代码,并在不同的抽象级别进行错误处理。
建议处理DAO内部立即发生的故障,如果无法恢复,则抛出以业务为中心的应用程序异常。
在某些情况下,由于您尝试存储重复项而可能违反约束,请考虑先查询重复项,然后在适当时修改并存储查询结果。Exceptions
相反,依赖捕获的可读性和效率较低。
归档时间: |
|
查看次数: |
773 次 |
最近记录: |