В чем разница между LocalContainerEntityManagerFactoryBean и LocalEntityManagerFactoryBean? - PullRequest
39 голосов
/ 27 мая 2011

Кто-нибудь может объяснить, в чем разница между LocalContainerEntityManagerFactoryBean и LocalEntityManagerFactoryBean ? 1005 *

Ответы [ 7 ]

34 голосов
/ 18 марта 2014

В основном Спецификация JPA определяет два типа менеджеров сущностей . Это:

i) Управляемый приложением: Управляемый приложением менеджер сущностей означает «Менеджеры сущностей создаются и управляются просто приложением (т.е. нашим кодом)».

ii) Управляемый контейнером: Управляемый контейнером диспетчер сущностей означает «Менеджеры сущностей создаются и управляются просто контейнером J2EE (т. Е. Наш код не управляет напрямую, а менеджеры сущностей создаются и управляются контейнером»). и наш код получает EM через что-то вроде использования JNDI).

Примечание. «Создан и управляем» (см. Выше) означает «открытие, закрытие и вовлечение менеджера сущностей в транзакции»

LocalContainerEntityManagerFactoryBean - управление контейнером
LocalEntityManagerFactoryBean - приложение управляется

Большое примечание: Для пружинных приложений разница невелика . Spring только играет роли (как контейнер , если вы настраиваете LocalContainerEntityManagerFactoryBean и как приложение , если вы настраиваете LocalEntityManagerFactoryBean )

16 голосов
/ 23 октября 2011

LocalEntityManagerFactoryBean

является самым простым и наиболее ограниченным.Вы не можете обратиться к существующему определению bean-компонента JDBC DataSource, и не существует поддержки глобальных транзакций.

LocalContainerEntityManagerFactoryBean

является наиболее мощной опцией установки JPA, допускающей гибкую локальную конфигурацию в приложении.Он поддерживает ссылки на существующий JDBC DataSource, поддерживает как локальные, так и глобальные транзакции

REF: spring-framework-reference.pdf "Spring 3"

16 голосов
/ 28 мая 2011

В документации все сказано:

LocalContainerEntityManagerFactoryBean - по ссылке: FactoryBean, создающий JPA EntityManagerFactory в соответствии со стандартным JPA-контейнером загрузочный контракт.

LocalEntityManagerFactoryBean - по ссылке: FactoryBean, которая создает JPA EntityManagerFactory в соответствии со стандартным автономным контрактом начальной загрузки JPA.

По сути, единственная разница заключается вкак они создают JPA EntityManagerFactory.

10 голосов
/ 24 октября 2011

LocalEntityManagerFactoryBean создает управляемый приложением EntityManagerFactory.

LocalContainerEntityManagerFactoryBean создает управляемый контейнером EntityManagerFactory.

Ссылка: Весна в действии - Крейг Уоллс

5 голосов
/ 18 августа 2016

Спецификация JPA определяет два типа менеджеров сущностей:

  • Управляемые приложением - менеджеры сущностей создаются, когда приложение напрямую запрашивает один из фабрики менеджеров сущностей,При использовании управляемых приложением менеджеров сущностей приложение отвечает за открытие или закрытие менеджеров сущностей и вовлечение менеджера сущностей в транзакции.Этот тип менеджера сущностей наиболее подходит для использования в автономных приложениях, которые не работают в контейнере Java EE.

  • Управляемый контейнером - Созданы менеджеры объектови управляется контейнером Java EE.Приложение вообще не взаимодействует с фабрикой диспетчера сущностей.Вместо этого менеджеры сущностей получают напрямую посредством внедрения или из JNDI.Контейнер отвечает за настройку фабрик менеджера сущностей.Этот тип диспетчера сущностей наиболее подходит для использования контейнером Java EE, который хочет сохранить некоторый контроль над конфигурацией JPA помимо того, что указано в persistence.xml.

Управляется приложением EntityManagers создаются с помощью EntityManagerFactory, полученного путем вызова createEntityManagerFactory() метода PersistenceProvider.Между тем управляемый контейнером EntityManagerFactorys получается с помощью метода createContainerEntityManagerfactory() PersistenceProvider.

Каждый вариант фабрики диспетчера сущностей создается соответствующим фабричным компонентом Spring:

  • LocalEntityManagerFactoryBean создает управляемый приложением объект Entity-ManagerFactory.

  • LocalContainerEntityManagerFactoryBean создает управляемый контейнером EntityManagerFactory

Важно отметить, что выбор сделан между управляемым приложением EntityManagerFactory и управляемым контейнеромEntityManagerFactory полностью прозрачен для приложений на основе Spring.Когда вы работаете с Spring и JPA, сложные детали работы с любой из форм EntityManagerFactory скрыты, поэтому ваш код доступа к данным сосредоточен на его истинном назначении: доступ к данным.

Единственный реальныйРазница между управляемыми приложением и управляемыми контейнером фабриками диспетчера сущностей, с точки зрения Spring, заключается в том, как каждая из них сконфигурирована в контексте приложения Spring.

0 голосов
/ 09 февраля 2019
  • Обе реализации LocalEntityManagerFactoryBean и LocalContainerEntityManagerFactoryBean возвращают ссылку на EntityManagerFactory из org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.
  • в каждом случае мы не будем использовать для каждой транзакции.*
  • Основное различие между этими двумя реализациями заключается в том, что LocalContainerEntityManagerFactoryBean обеспечивает программную настройку единицы сохраняемости (источник данных и packageToScan), является более гибким в том смысле, что мы можем переопределить расположение файла persistence.xml по сравнению с LocalEntityManagerFactoryBean, в котором мы должны использоватьпредопределенное имя persistence.xml

Если оба используют resource_local по умолчанию, тогда не будет установлено, что LocalContainerEntityManagerFactoryBean использует транзакцию, управляемую контейнером, а другие используют транзакцию, управляемую приложением.

При использовании JPA вне контейнера ввода зависимостей, transacРазработчики должны обрабатывать программы.Если используется JPA внутри контейнера внедрения зависимости Spring, то он может обрабатываться контейнером Spring.

Пример использования LocalContainerEntityManagerFactoryBean

public class DataConfig {
    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        //LocalEntityManagerFactoryBean lfb = new LocalEntityManagerFactoryBean();
        LocalContainerEntityManagerFactoryBean lfb = new LocalContainerEntityManagerFactoryBean();
        lfb.setDataSource(dataSource());
        lfb.setPersistenceUnitName("localEntity");
        lfb.setPersistenceProviderClass(HibernatePersistence.class);
        lfb.setPackagesToScan("com.javasampleapproach.h2database.model");
        lfb.setJpaProperties(hibernateProps());
        return lfb;
    }
}
@Component
public class PostRepository {
  @Autowired
    EntityManagerFactory emf;
  }
  public void create(){
      EntityManager em = emf.createEntityManager();
      Post post = new Post("First post");
      em.getTransaction().begin();
      em.persist(post);
      em.getTransaction().commit();
  }
}

Ошибка с LocalEntityManagerFactoryBean

java.lang.IllegalStateException: Не разрешается создавать транзакции в совместно используемом EntityManager - вместо этого используйте транзакции Spring или EJB CMT

public class DataConfig {
    @Bean
    LocalEntityManagerFactoryBean entityManagerFactory() {
        LocalEntityManagerFactoryBean lfb = new LocalEntityManagerFactoryBean();
        lfb.setPersistenceUnitName("localEntity");
        lfb.setPersistenceProviderClass(HibernatePersistence.class);
        lfb.setJpaProperties(hibernateProps());
        return lfb;
    }
}

@Component
    public class PostRepository {
      @Autowired
      EntityManager em;

      public void create(){
          EntityManager em = emf.createEntityManager();
          Post post = new Post("First post");
          em.getTransaction().begin();
          em.persist(post);
          em.getTransaction().commit();
      }
    }
<persistence-unit name="localEntity">
</persistence-unit>

Рабочий код с LocalEntityManagerFactoryBean

Spring, управляемой транзакцией, напримерУправляется контейнером в случае LocalEntityManagerFactoryBean.

public class DataConfig {
    @Bean
    LocalEntityManagerFactoryBean entityManagerFactory() {
        LocalEntityManagerFactoryBean lfb = new LocalEntityManagerFactoryBean();
        lfb.setPersistenceUnitName("localEntity");
        lfb.setPersistenceProviderClass(HibernatePersistence.class);
        lfb.setJpaProperties(hibernateProps());
        return lfb;
    }
}

@Component
public class PostRepository {
  @Autowired
  EntityManagerFactory emf;

  @Transactional
  public void create() {
    Post post = new Post("First post");
    em.persist(post);
  }
}

<persistence-unit name="localEntity">
</persistence-unit>

Обе реализации могут использоваться в транзакции, управляемой контейнером, пожалуйста, исправьте меня, если требуется некоторая коррекция.

0 голосов
/ 26 ноября 2018

LocalEntityManagerFactoryBean создает EntityManagerFactory с помощью PersistenceProvider.createEntityManagerFactory ()

LocalContainerEntityManagerFactoryBean создает EntityManagerFactory с помощью PersistenceProvider.createContainagerFactan) ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...