spring boot jpa 自定义添加 Entity
起因
项目中带有Entity注解类很多,但实际使用的只有一小部分,每次启动都需要验证实体与表结构,拖慢启动速度(spring boot版本1.5.4 )
解决方案
常用的自己可控的Entity类放在一个包下,走以前spring boot Jpa 逻辑,采用扫描包获取,外部不可控Entity进行改造配置
- 启动类注解扫表包修改
@EnableJpaRepositories("XXXXXXX")
@EntityScan("XXXXXX") - 继承LocalContainerEntityManagerFactoryBean类,覆盖determinePersistenceUnitInfo 方法 并在方法中添加自己需要添加的Entity类
public class MyLocalContainerEntityManagerFactoryBean extends LocalContainerEntityManagerFactoryBean { @Override protected PersistenceUnitInfo determinePersistenceUnitInfo(PersistenceUnitManager persistenceUnitManager) { PersistenceUnitInfo persistenceUnitInfo = super.determinePersistenceUnitInfo(persistenceUnitManager); List<String> managedClassNames = persistenceUnitInfo.getManagedClassNames(); managedClassNames.add("com.test.domain.User(自己的entity类)"); return persistenceUnitInfo; } }
- 添加配置类代替原有LocalContainerEntityManagerFactoryBean
@Configuration public class MyHibernateJpaAutoConfiguration extends HibernateJpaAutoConfiguration { 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; } }
浙公网安备 33010602011771号