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を配置できません。