Eclipselink: Как вы получаете EntityManager в каждом пакете? - PullRequest
6 голосов
/ 13 июля 2010

Интересно, есть ли хороший способ иметь EntityManager в каждом пакете? Или как правильно использовать JPA в программе OSGi.

На самом деле, у меня есть один основной пакет, который загружает файл persistence.xml и создает экземпляр EntityManager. После этого мой основной пакет передает экземпляр Entity Manager другим пакетам через сервисы. Поэтому я использую возможности служб равноденствия и уверен, что должно существовать другое решение для получения EntityManager в каждом комплекте!

Знаете ли вы другое решение? или верный способ добиться этого?

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Если вы пишете настольное приложение (и, следовательно, не имеете доступа к персистентности, управляемой контейнером), я предлагаю вам опубликовать EntityManageFactory как службу, а не EntityManager.Ваш код будет иметь такой макет:

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();
  }
}

Надеюсь, это поможет вам понять.

3 голосов
/ 13 июля 2010

Вы смотрели примеры JPG OSGi на вики-сайте EclipseLink: http://wiki.eclipse.org/EclipseLink/Examples/OSGi

EclipseLink упакован и предназначен для работы в OSGi. В скором времени появится Eclipse Gemini JPA, который добавляет поддержку использования EclipseLink через новый стандарт OSGi JPA (www.eclipse.org/gemini/jpa, Stackoverflow не позволяет мне публиковать полный URL-адрес). Я думаю, что вы хотели бы Gemini JPA, поскольку спецификация очень ориентирована на сервисы, а EntityManagerFactory может быть получен через сервисы из любого пакета. Мы работаем над начальным этапом для Gemini JPA, поэтому сейчас я буду придерживаться EclispeLink OSGi.

- Shaun

...