EntityManagerFactoryBuilder
JPA EntityManagerFactory 实例的构建器.
允许你通过一个构建器模式创建一个或多个 LocalContainerEntityManagerFactoryBean, 并做一些常见配置.
该构建器中包含了最常见的配置选项.
你也可以在一个带 @Bean 注解的 definition 方法返回之前, 通过该构建器中配置更多的选项.
该构造器会在 org.springframework.boot.autoconfigure.ORM.jpa.JpaBaseConfiguration 中被 Spring 容器创建好:
- @Bean
- @ConditionalOnMissingBean
- @SuppressWarnings("deprecation")
- public EntityManagerFactoryBuilder entityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter, ObjectProvider<PersistenceUnitManager> persistenceUnitManager) {
- EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(jpaVendorAdapter, this.properties.getProperties(), persistenceUnitManager.getIfAvailable());
- builder.setCallback(getVendorCallback());
- return builder;
- }
使用的时候, 只需要注入即可:
- // 配置实体管理器工厂类: EntityManagerFactory
- @Bean
- @Primary
- public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
- return builder.dataSource(dataSource())
- /*
- 这个 packagesToScan 必须配置, 如果不配置, 会出现下面的问题:
- java.lang.IllegalArgumentException: No persistence unit with name 'sysPU' found
- 参看源码: org.springframework.ORM.jpa.persistenceunit.DefaultPersistenceUnitManager.obtainPersistenceUnitInfo(DefaultPersistenceUnitManager.java:496)中的 readPersistenceUnitInfos()方法
- 需要配置 packagesToScan 参数, 才能构建一个默认的 PersistenceUnit
- */
- .packages("com.system.manage.entity")
- .persistenceUnit("sysPU")
- .build();
- }
- LocalContainerEntityManagerFactoryBean
这是一个创建符合 JPA 标准的 EntityManagerFactory 的 org.springframework.beans.factory.FactoryBean.
这是在 Spring 应用上下文 (application context) 中创建 JPA EntityManagerFactory bean 的最好方式.
可以通过依赖注入 (使用 @PersistenceContext 注解) 将 EntityManagerFactory 传递给基于 JPA 注解的 DAOs.
注意: 可以通过配置, 切换到 JNDI 查找或切换到 LocalEntityManagerFactoryBean definition.
根据通用 JPA 配置约定, 配置设置通常从 Class Path 的 META-INF/persistence.xml 配置文件读取, 就像 LocalEntityManagerFactoryBean 一样.
但是, 你如果使用 LocalContainerEntityManagerFactoryBean 的话, 配置会更加灵活. 你可以覆盖 persistence.xml 文件的位置, 可以指定要使用的 JDBC 数据源等等.
此外, 它允许通过 Spring 的 org.springframework.instrument.classloading.LoadTimeWeaver 实现可插拔类, 而不是绑定到 JVM 启动时指定的特殊 VM 代理.
LocalContainerEntityManagerFactoryBean 在内部自己解析 persistence.xml 文件, 并创建相对应的 javax.persistence.spi.PersistenceUnitInfo 对象(通过进一步合并配置, 如 JDBC 数据源和
org.springframework.instrument.classloading.LoadTimeWeaver), 然后传递给选择的 JPA Provider(javax.persistence.spi.PersistenceProvider), 比如默认的 org.hibernate.jpa.HibernatePersistenceProvider. 这是一个完全支持标准 JPA 容器规约的本地 JPA 容器.
公开的 EntityManagerFactory 对象实现了下面两种接口:
由 PersistenceProvider 返回的原生 EntityManagerFactory 接口
由当前 FactoryBean 装配的其他附件元数据的 EntityManagerFactoryInfo 接口
SharedEntityManagerCreator
在 org.springframework.ORM.jpa 包中.
在这个类中, 使用反射创建 EntityManager 的实现类.
public static EntityManager createSharedEntityManager(EntityManagerFactory emf,........)
创建好之后, 由 org.springframework.ORM.jpa.supportPersistenceAnnotationBeanPostProcessor 注入到 Dao 类中.
PersistenceContext
这是一个注解.
表明了 EntityManager 与相关联的持久性上下文 (persistence context) 有依赖关系.
- public class BaseDao {
- @PersistenceContext
- EntityManager entityManager;
- ......
- }
来源: http://www.jianshu.com/p/cc5c9b4c294c