2010-07-13 6 views
6

각 번들에 EntityManager를 설치하는 좋은 방법이 궁금합니다. 또는 OSGi 프로그램에서 JPA를 올바르게 사용하는 방법.Eclipselink : 각 번들에서 EntityManager를 어떻게 얻습니까?

실제로, 나는 persistence.xml 파일을로드하고 EntityManager를 인스턴스화하는 하나의 메인 번들을 가지고있다. 그런 다음, 내 메인 번들은 Entity manager의 인스턴스를 서비스를 통해 다른 번들에 제공한다. 그래서 나는 춘분 서비스의 힘을 사용하며 각 번들에서 EntityManager를 얻는 또 다른 솔루션이 있어야한다고 확신합니다!

다른 해결책을 알고 계십니까? 또는이를 달성하기위한 올바른 방법?

답변

3

당신은 EclipseLink가 위키에 JPA OSGi 프레임 예제를 살펴 찍은 적이 : http://wiki.eclipse.org/EclipseLink/Examples/OSGi

는 EclipseLink를위한 포장은 OSGi에서 작동하도록 설계되었습니다. 곧 출시 될 Eclipse Gemini JPA는 새로운 OSGi JPA 표준 (www.eclipse.org/gemini/jpa, Stackoverflow에서 전체 URL을 게시하지 않음)을 통해 EclipseLink를 사용하기위한 지원을 추가합니다. 제미니 JPA는 스펙이 매우 서비스 지향적이어서 EntityManagerFactory가 모든 번들에서 서비스를 통해 얻을 수 있기를 희망한다고 생각합니다. 우리는 쌍둥이 자리 JPA에 대한 초기 이정표를 향해 노력하고 있습니다. 그래서 나는 EclispeLink OSGi를 고수 할 것입니다.

--Shaun

+0

감사합니다. 그러나 웹 사이트에서 각 번들에 EntityManager 인스턴스를 포함하는 방법을 설명하지 않았습니다 ... 도와 주시겠습니까? 아니면 예를 들어 주시겠습니까? 많은 감사 – user376112

3

당신이 (지속성을 컨테이너 - 관리에 액세스 할 수없는 따라서 등) 데스크톱 응용 프로그램을 작성하는 경우, 당신은 서비스, 그리고 EntityManager를로 EntityManageFactory을 게시 좋습니다.

public void someBusinessMethod() { 
    EntityManager em = Activator.getEntityManager(); 
    try { 
    ... 
    } finally { 
    em.close(); 
    } 
} 

그리고 당신의 활성화에 :이 당신에게 아이디어를 제공하는 데 도움이

public class Activator 
    implements BundleActivator { 
    private static ServiceTracker emfTracker; 

    public void start(BundleContext context) { 
    emfTracker = new ServiceTracker(context, EntityManagerFactory.class.getCanonicalName(),null); 
    emftracker.open(); 
    } 

    public void stop(BundleContext context){ 
    emfTracker.close(); 
    emfTracker = null; 
    } 

    public static EntityManager getEntityManager() { 
    return ((EntityManagerFactory)emfTracker.getService()).createEntityManager(); 
    } 
} 

희망 코드는 다음이 레이아웃을해야합니다.

관련 문제