【发布时间】:2016-10-04 14:32:42
【问题描述】:
我正在尝试通过 DeltaSpike 库使用 @Transactional,但我遇到了一些问题。让我们看看:
1) 我有一个使用自定义限定符创建 EntityManager 的 DAO 生产者。
@Produces
@PersistenceUnitName(value="")
public DAO criar(InjectionPoint ip) {
String persistenceUnit = "";
EntityManager em = null;
for (Annotation annotation : ip.getQualifiers()) {
if (annotation instanceof PersistenceUnitName) {
persistenceUnit = ((PersistenceUnitName) annotation).value();
}
}
em = Persistence.createEntityManagerFactory(persistenceUnit).createEntityManager();
return new DAO(em);
}
现在假设我在其他类中注入 DAO:
@Inject @PersistenceUnit(value="myPU01")
private DAO dao;
调用生产者并使用 myPU01 创建 EntityManager。但在 DAO 类中,我有一个方法 save,我想使用 DeltaSpike lib 中的@Transactional:
@Transactional
public void save(AbstractEntity entidade) {
em.persist(entidade);
em.flush();
}
问题就在这里。 @Transactional 将尝试创建另一个 EntityManager,但我已经使用 myPU01 创建了一个 EntityManager。我不能将 persistenceUnitName 放在“保存”旁边。
【问题讨论】:
-
为每个创建的对象调用
Persistence.createEntityManagerFactory(persistenceUnit)似乎是一个非常糟糕的主意。
标签: jpa cdi deltaspike