2016-10-04 4 views
0

@TransactionalをDeltaSpikeライブラリで使用しようとしていますが、いくつか問題があります。見てみましょう:既に@Transactional DeltaSpikeで作成されたEntityManagerを使用しています

1)カスタム修飾子を使用してEntityManagerを作成するDAOプロデューサがあります。

@Inject @PersistenceUnit(value="myPU01") 
    private DAO dao; 

プロデューサーが呼び出されるとのEntityManagerがmyPU01を使用して作成されます。

@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を注入だと想像してみてください。しかし、DAOクラス内私は、メソッドが保存していると私はDeltaSpike libにから@Transactionalを使用したい:

@Transactional 
    public void save(AbstractEntity entidade) { 
     em.persist(entidade); 
     em.flush(); 
    } 

問題はここに住んでいます。 @Transactionalは別のEntityManagerを作成しようとしますが、すでにmyPU01で作成されたEntityManagerを持っています。私は、 "save"の横にpersistenceUnitNameを置くことはできません。

+0

作成されたオブジェクトごとに 'Persistence.createEntityManagerFactory(persistenceUnit)'を呼び出すことは非常に悪い考えです。 –

答えて

0

Entity-Manager(@TransactionScopedなどの有効なスコープを持つ)には、独自のプロデューサが必要です。このEntity-ManagerをBeanとDAOのProducer-Method(パラメータとして)に挿入します。 DeltaSpikeのCDIとには号/制限/ ...の規則があります。

+0

FYI:コミュニティに直接質問した場合、数時間以内に回答を受け取ることになります。 –

+0

私に例を教えてもらえますか? – RonaldoLanhellas

関連する問題