2016-07-06 3 views
1

Должен ли я создавать и закрывать EntityManagerFactory в каждой функции? или я должен создать его, когда приложение запускается и закрывается при закрытии приложения? Как я могу это достичь?EntityManagerFactory для каждой функции?

Например:

У меня есть две функции:

Функция, которая получает объекты из базы данных:

private List<SomeItems> getItems() { 

    List<SomeItems> resultList = new ArrayList<SomeItems>(); 

    entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 
    entityManager = entityManagerFactory.createEntityManager(); 

    entityManager.getTransaction().begin(); 

    TypedQuery<SomeItems> query = entityManager.createQuery(
      "select n from SomeItems n", SomeItems.class); 

    resultList = query.getResultList(); 

    entityManager.getTransaction().commit(); 
    entityManager.close(); 
    entityManagerFactory.close(); 

    return resultList; 
} 

Функция, которая получает только имя деталей:

private List<String> getItemsName() { 
List<String> resultList = new ArrayList<String>(); 

entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 
entityManager = entityManagerFactory.createEntityManager(); 

entityManager.getTransaction().begin(); 

TypedQuery<String> query = entityManager.createQuery(
     "select n.name from SomeItems n", String.class); 

resultList = query.getResultList(); 

entityManager.getTransaction().commit(); 
entityManager.close(); 
entityManagerFactory.close(); 

return resultList; 
} 

Как следует Я улучшаю это?

+0

Я бы ожидал, что ВСЕ JPA-документы для каждого поставщика JPA упомянут о том, что EMF стоит дорого, в то время как EM дешево. Если в документах вашего провайдера не говорится, что тогда вы предлагаете вам поднимать проблему на них –

ответ

2

Невозможно создать EntityManagerFactory каждый раз. Это очень дорого. Создайте его по требованию. Это нормально для EntityManager, который создается несколько раз. Но на фабрике нет. Вы можете использовать синглтон с ленивым или нетерпеливым типом инициализации. Ваш звонок. Или просто статический блок инициализатора где-то. Много вариантов. Ключевым моментом является не создание фабрики при каждом повторном использовании вызова. Хорошо, вот одна примерная реализация может быть не лучшей, но она работает.

class EntityManagerFactoryHolder { 
private static EnityManager entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 

public EntityManagerFactory getEntityManager(){ 
    return entityManagerFactory; 
} 
} 

Это синглтон с инициализацией EAGER. Если вы хотите, чтобы LAZY выглядел в Интернете.

+0

Можете ли вы дать пример кода? и как насчет его закрытия? как я могу это достичь? –

+0

Хорошо в отношении менеджера сущности вы можете обернуть метод в try {} finally {entityManager.close()} –

+0

Возможно, я ошибаюсь, но как насчет этой строки? 'entityManagerFactory.close();' это нужно? или когда я должен это поставить? –

Смежные вопросы