Tom*_*ker 4 java spring hibernate jpa
我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。
@Transactional
public String save(Object bean) {
String error = null;
try {
EntityManager entityManager = getEntityManager();
for (int i = 0, n = entities.size(); i < n; i ++) {
entityManager.merge(entities.get(i));
}
}
catch (PersistenceException e) {
error = e.getMessage();
}
return error;
}
Run Code Online (Sandbox Code Playgroud)
但是我得到一个异常,说javax.persistence.RollbackException: Transaction marked as rollbackOnly.我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢?
如果方法中抛出任何RuntimeExceptions,则使用@Transactional,它将自动执行回滚。您无需手动进行。您可能根本不应该捕获该异常,而应将其传递给更高级别的ExceptionHandler,该异常处理程序向用户显示一些标准错误页面(而不是堆栈跟踪)。同样,您的方法被标记为void,但是您将返回一个String。
您可以将Spring的Exception Translation与自定义结合使用,PersistenceExceptionTranslator以翻译PersistenceException成有用的东西。
哦,顺便说一句,您不应该@Transactional在DAO级别使用。事务应从服务级别开始。
似乎没有办法回滚由 Spring ORM 管理的失败事务。问题中显示的代码是一个服务类。将其持久性例程提取到单独的 DAO 类并拥有服务类句柄PersistenceExceptions就可以了。
| 归档时间: |
|
| 查看次数: |
21372 次 |
| 最近记录: |