2013-06-17 3 views
0

안녕하세요, 저는 사용자 인증을 담당하는 OSGi 번들을 프로그래밍하고 있습니다. 설계상의 이유로 여러 데이터베이스 스키마에 대해 쿼리를 수행해야합니다 (이러한 스키마는 동적으로 생성되거나 삭제 될 수 있습니다). 나는 스토리지 엔진으로 MySQL을 실행 중입니다.OSGi 및 지속성 단위

어떻게 든 그 스키마에 대한 요청 엔터티 관리자를 만들 수 있어야하지만 내 시도에서는 성공하지 못했습니다. 내가 원하는 것에 더 가까이 다가 가려는 시도는 다음과 같습니다.

사실, 기본 스키마에 데이터베이스 연결을 설정할 수있는 JTA 데이터 소스를 사용하여 지속성 단위 (Eclipselink)를 생성합니다. 그러나 어떤 속성을 재정의하려고하면 javax.persistence.jdbc.url과 같이 말합니다. 그러나 항상 기본 스키마를 계속 가리 킵니다.

나는 올바르게 속성을 오버라이드하지 않고 있거나, JTA 데이터 소스 속성을 EntityManager에서 EntityManager으로 수정할 수 없다고 생각합니다. 그래서 내 질문은, 그들 모두가 기본 스키마에 poiting 유지, 마지막에

Map<String, String> dbProps = new HashMap<String, String>();    
dbProps.put("javax.persistence.jdbc.url","jdbc:mysql://mydomain:3306/mydynamicdb);               
EntityManagerFactory fact = Persistence.createEntityManagerFactory("myPersistenceUnit", dbProps); 
EntityManager myEM = fact.createEntityManager(); 

:

  1. 이 동적 EntityManager의 처리를위한 효율적인 접근 방식 여기 내가 EntityManagers을 만드는 방법입니까? 그렇다면 어떻게 스키마 속성을 효과적으로 오버라이드 할 수 있습니까?
  2. 재정의 외에 다른 대안이 있습니까?

제공되는 지침에 대해 미리 감사드립니다.

답변

1

OSLink에서 EclipseLink를 사용하려면 Gemini JPA 프로젝트를 사용하여 EclipseLink를 랩핑하고 PU 번들에 대한 EntityManagerFactory 및 EntityManagerFactoryBuilder 서비스를 작성하고 등록해야합니다. PU간에 jdbc 연결을 공유하려는 경우 제공되는 JDBC 서비스를 사용할 수 있습니다 Gemini DBAccess

+0

감사합니다. 올바른 길을 찾아주세요! –

1

당신은, 당신이 (LDAP)에서와 같이 서비스 속성 osgi.unit.name를 사용하여 올바른 하나를 필터링 할 수 있습니다 OSGi 서비스로 EntityManagerFactory을 획득 할 수 있어야한다 :

ServiceReference[] refs = null;   
    String filter = "(osgi.unit.name=myPersistenceUnit)"; 
    ServiceReference[] refs = ctx.getServiceReferences(EntityManagerFactory.class.getName(), filter); 
    //Should only be one reference, check (throw exception etc) 
    return (EntityManagerFactory)ctx.getService(refs[0]); 

당신은 모든 지속성 단위가 있는지 확인하실 수 있습니다 OSGi 쉘에 EntityManagerFactory 서비스 (등록 정보 포함)를 나열하여.

관련 문제