- Обе реализации 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>
Обе реализации могут использоваться в транзакции, управляемой контейнером, пожалуйста, исправьте меня, если требуется некоторая коррекция.