2016-10-04 2 views
0

나는 DeltaSpike 라이브러리에서 @Transactional을 사용하려고하는데, 몇 가지 문제가 있습니다. 어디 보자 :@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

관련 문제