任何人都可以解释什么是Spring框架的LocalContainerEntityManagerFactoryBean和LocalEntityManagerFactoryBean负责区别?
基本上JPA规范定义了两种类型的实体管理的。他们是 : 我)应用程序管理:应用管理的实体管理的意思是“实体管理器仅通过将应用程序创建和管理(即我们的代码)”。
II)容器管理:容器管理的实体管理的意思是“实体管理器创建和管理由单纯的J2EE容器(即我们的代码不直接管理,而不是实体管理器创建和容器管理,我们的代码被EM是通过某种方式像使用JNDI)。
注:创建和管理(以上)的意思是“开,关,在交易涉及的实体管理器”
LocalContainerEntityManagerFactoryBean - 容器管理 LocalEntityManagerFactoryBean负责 - 应用管理
一个大注:对于基于Spring应用程序,所不同的是并不多。只有春(如果配置LocalContainerEntityManagerFactoryBean和应用程序,如果您配置LocalEntityManagerFactoryBean负责为容器)中扮演的角色
该文件说,这一切:
LocalContainerEntityManagerFactoryBean - 从链接:FactoryBean的,根据JPA的标准集装箱引导合约创建JPA EntityManagerFactory的。
LocalEntityManagerFactoryBean - 从链接:FactoryBean的,根据JPA的标准独立引导合约创建JPA EntityManagerFactory的。
从本质上讲,唯一不同的是他们是如何创建JPA EntityManagerFactory
。
LocalEntityManagerFactoryBean负责
是最简单和最有限的。你不能引用现有的JDBC DataSource的bean定义,并为全球交易不存在支持。
LocalContainerEntityManagerFactoryBean
是最强大的JPA设置选项,允许在应用程序内灵活的本地配置。它支持链接到现有的JDBC DataSource,支持本地和全局事务
REF:弹簧框架,参考.pdf“春3”
LocalEntityManagerFactoryBean负责产生一个应用程序管理的EntityManagerFactory的。
LocalContainerEntityManagerFactoryBean产生容器管理的EntityManagerFactory。
参考:春天在行动 - 克雷格·沃尔斯
JPA规范定义了两种类型的实体管理器:
应用程序管理的EntityManagers
由通过调用PersistenceProvider类的EntityManagerFactory
方法获得的createEntityManagerFactory()
创建。与此同时,容器管理EntityManagerFactorys通过PersistenceProvider类的createContainerEntityManagerfactory()
method获得。
实体管理器工厂的每个风味由相应的Spring工厂bean的生产:
LocalEntityManagerFactoryBean
产生一个应用程序管理的实体 - ManagerFactory。LocalContainerEntityManagerFactoryBean
产生容器管理的EntityManagerFactory它指出,应用程序管理EntityManagerFactory
和容器管理EntityManagerFactory
之间做出的选择是完全透明的,基于Spring的应用程序是很重要的。当你使用Spring和JPA的工作,处理EntityManagerFactory
的两种形式的复杂细节被隐藏起来,让你的数据访问代码集中于它的真实目的:数据访问。
应用程序管理和容器管理的实体管理器工厂之间的唯一真正的区别,就春季来说,是多么的每一个在Spring应用程序上下文配置。
如果两者都使用RESOURCE_LOCAL为默认值,然后它不是LocalContainerEntityManagerFactoryBean使用容器管理的事务和其他正在使用的应用程序管理的事务经验法则。
当依赖注入容器的外部使用JPA,交易需要由显影剂编程方式处理。如果使用JPA春天依赖注入容器,然后它可以通过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负责
在LocalEntityManagerFactoryBean负责的情况下,像Spring管理事务容器管理。
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>
两种实现可以容器管理的事务下使用,请大家指正在此,如果一些修正的需要。
LocalEntityManagerFactoryBean负责创建经由PersistenceProvider.createEntityManagerFactory EntityManagerFactory的()
LocalContainerEntityManagerFactoryBean创建经由PersistenceProvider.createContainterEntityManagerFactory EntityManagerFactory的()