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;
......
}
网友评论