Spring-boot與jpa
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; ...... }