spring boot jpa 自定義新增 Entity
阿新 • • 發佈:2020-09-11
起因
專案中帶有Entity註解類很多,但實際使用的只有一小部分,每次啟動都需要驗證實體與表結構,拖慢啟動速度
解決方案
常用的自己可控的Entity類放在一個包下,走以前spring boot Jpa 邏輯,採用掃描包獲取,外部不可控Entity進行改造配置
- 啟動類註解掃表包修改
@EnableJpaRepositories("XXXXXXX")
@EntityScan("XXXXXX") - 繼承LocalContainerEntityManagerFactoryBean類,覆蓋determinePersistenceUnitInfo 方法 並在方法中新增自己需要新增的Entity類
public
- 新增配置類代替原有LocalContainerEntityManagerFactoryBean
@Configuration public class MyHibernateJpaAutoConfiguration extendsHibernateJpaAutoConfiguration { public MyHibernateJpaAutoConfiguration(DataSource dataSource, JpaProperties jpaProperties,
ObjectProvider<JtaTransactionManager> jtaTransactionManager,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) { super(dataSource, jpaProperties, jtaTransactionManager, transactionManagerCustomizers); } @Bean @Primary public LocalContainerEntityManagerFactoryBean entityManagerFactory( JpaVendorAdapter jpaVendorAdapter, ObjectProvider<PersistenceUnitManager> persistenceUnitManager) { Map<String, Object> vendorProperties = getVendorProperties(); customizeVendorProperties(vendorProperties); MyLocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new MyLocalContainerEntityManagerFactoryBean(); if (persistenceUnitManager.getIfAvailable() != null) { entityManagerFactoryBean.setPersistenceUnitManager(persistenceUnitManager.getIfAvailable()); } entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter); if (isJta()) { entityManagerFactoryBean.setJtaDataSource(super.getDataSource()); } else { entityManagerFactoryBean.setDataSource(super.getDataSource()); } entityManagerFactoryBean.setPackagesToScan(super.getPackagesToScan()); entityManagerFactoryBean.getJpaPropertyMap() .putAll(super.getProperties().getProperties()); entityManagerFactoryBean.getJpaPropertyMap().putAll(vendorProperties); return entityManagerFactoryBean; } }