如何解决事务性 CDI bean 中的 EntityManager
我有一个与我的持久性单元 (myPU) 相关联的 EntityManager。 我有以下代码代表一个通用的 DataAccessObject,我想使用它来在新事务中执行任务(需要新的)。 这个 DataAccessObject 被注入到一个 EJB 中,它的唯一方法在一个 while 循环中被调用。 EJB 中存在另一个引用相同持久性单元的 EntityManager 实例。 我期望在每次调用 DataAccessObject 实例时,都会根据以下代码创建和提交(或回滚)一个新事务。
问题是我收到了需要交易的异常。我错过了什么?
@Dependent
@ManagedBean
public class DataAccessObject {
private static final Logger logger = Logger.getLogger(DataAccessObject.class);
@PersistenceContext(unitName = "scheduler")
private EntityManager entityManager;
@Transactional(value = TxType.REQUIRES_NEW,rollbackOn = Exception.class)
public void executeInNewTransaction(TransactionalTask transactionalTask) throws TransactionalException {
Throwable exception = null;
try {
logger.debug(" A new transaction has been created for transactional task: \"",transactionalTask,"\".");
transactionalTask.onExecute(entityManager);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
exception = e;
} catch (ConstraintViolationException e) {
Set<ConstraintViolation<?>> constraintViolation = e.getConstraintViolations();
logger.error("Exception during bean validation:");
if (constraintViolation != null) {
for (ConstraintViolation<?> violation : constraintViolation) {
logger.error(String.format("%s=\"%s\" error: %s",violation.getPropertyPath(),violation.getInvalidValue(),violation.getMessage()));
}
}
exception = e;
} catch (Throwable e) {
exception = e;
} finally {
if (exception != null || transactionalTask.mustRollBack()) {
throw new TransactionRolledBackException("Transaction is being rolled back for transactional task: \"" + transactionalTask + "\".",exception);
} else {
logger.debug(" Transaction has been committed successfully for transactional task: \"","\".");
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。