spring boot jpa 自定义添加 Entity

起因

  项目中带有Entity注解类很多,但实际使用的只有一小部分,每次启动都需要验证实体与表结构,拖慢启动速度(spring boot版本1.5.4 )

解决方案

  常用的自己可控的Entity类放在一个包下,走以前spring boot Jpa 逻辑,采用扫描包获取,外部不可控Entity进行改造配置

  

  1.  启动类注解扫表包修改
    @EnableJpaRepositories("XXXXXXX")
    @EntityScan("XXXXXX")
  2.  继承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;
        }
    }

     

  3.  添加配置类代替原有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; } }

 

posted @ 2020-09-11 16:44  yang91  阅读(1217)  评论(0)    收藏  举报