1. 程式人生 > 實用技巧 >spring boot jpa 自定義新增 Entity

spring boot jpa 自定義新增 Entity

起因

  專案中帶有Entity註解類很多,但實際使用的只有一小部分,每次啟動都需要驗證實體與表結構,拖慢啟動速度

解決方案

  常用的自己可控的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"); 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; } }