2011-09-22 7 views
0

"customerCode"(String) 매개 변수를 가져 오는 EJB3 Stateless Session Bean을 작성하려고합니다. 이 "customerCode"에 의존하여 (동적으로 생성 된) PersistenceUnit으로 EntityManager (Persistence.createEntityManagerFactory ...)를 만들고 싶습니다.런타임에 파라미터 화 된 Persistence Unit + JTA DataSource 생성 (문맥에 따라 다름)

이름 (및 기본 데이터 소스)이 런타임에 추가/제거 될 수 있어야하므로 persistence.xml에서 PU를 정의 할 수 없습니다 (예 : 특정 고객 코드에 속한 새 데이터 소스/지속성 유닛 배포).

사전에 모든 customerCodes를 알고 있기 때문에 persistence.xml에 PU를 정의 할 수 있지만 컨테이너 (JBOSS)가 데이터 소스 XML 파일을 찾지 못하여 데이터 소스 XML 파일이 없으면 올바르게 EAR을 배치 할 수 없습니다. 일치하는 데이터 소스

무엇을 할 수 있습니까? 미리 감사드립니다. !

답변

1

예, 이렇게 할 수 있습니다. 대략적인 사항은 다음과 같습니다.

private static Map<String, EntityManagerFactory> emfMap 
        = new HashMap<String, EntityManagerFactory>(); 
private static List<String>customerCodes; 

당신은 분명히 당신은 단지 키에 의해 Hasmap에서 그것을 얻을 수 populateEmfMap

public static void populateEmfMap() 
    { 
     for (String customerCode : customerCodes) 
     { 
      emfMap.put(customerCode,Persistence.createEntityManagerFactory(customerCode)); 
     } 

    } 

를 호출하기 전에 customerCodes의 목록을 채울 필요가있다.

+0

그러나 customerCode는 persistance.xml에 정의 된 지속성 단위 이름이어야합니까? Persistence.createEntityManagerFactory를 호출하기 전에 persistance unit을 정의해야합니다. 여기에있는 질문은 아마 런타임에 지속 유닛을 어떻게 재조정 할 것인가입니다. – simonC

+1

재미있는 개념이 그것이 OP가 끝난 후의 것이라면. 그 구성으로 내려갈 것입니다하지만 난 새로운 PU를 만드는 개념을 내 머리를 얻을 수 없다 특히 어떤 새로운 배포 또는 서버를 restarts.With 어떤 POC는 그루비가 반드시 하나의 후보라고 생각하지만 당신은 여전히 ​​수정해야합니다 스크립트는 다시 시작하지 않아도되지만 더 낮은 수준의 작업입니다. – Shahzeb

+0

나는 tih가 JPA 스펙에 의해 지원되지 않는 곳을 읽었을뿐 아니라, 런타임시 지속성 단위 생성을 지원하는 datanucleus whith seam을 발견했다. 그래서 datanucleus가 그것을 할 수 있다면, 나는 여전히 어떻게 알아 내야한다 : -) – simonC