2016-10-04 52 views
0

我想通過DeltaSpike庫使用@Transactional,但我遇到了一些問題。讓我們看看:使用已使用@Transactional創建的EntityManager DeltaSpike

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類中,我有一個方法保存,我想用@Transactional從DeltaSpike lib目錄下:

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

問題住在這裏。 @Transactional將嘗試創建另一個EntityManager,但我已經有一個使用myPU01創建的EntityManager。我不能把persistenceUnitName放在「save」旁邊。

+0

爲每個創建的對象調用'Persistence.createEntityManagerFactory(persistenceUnit)'似乎是一個非常糟糕的主意。 –

回答

0

您需要一個自己的實體管理器生產者(具有有用的作用域,例如@TransactionScoped)。將這個實體管理器注入到您的bean以及您的DAO的生產者方法中(作爲參數)。 這是CDI的規則和沒有問題/限制/ ...的DeltaSpike。

+0

供參考:如果您直接詢問社區,您會在幾個小時內收到答案。 –

+0

你能舉個例子嗎? – RonaldoLanhellas

相關問題