如何以及为什么spring容器为持久性单元'default'构建EntityManagerFactory?

时间:2015-08-28 06:24:06

标签: spring-mvc spring-boot spring-data-jpa spring-data

我正在使用spring boot并尝试使用spring jpa实现多个数据源。

问题当我运行服务器时,LocalContainerEntityManagerFactoryBean为默认持久性单元构建JPA容器。

我从AutoConfiguration中排除了 HibernateJpaAutoConfiguration.class ,所以它不应该用于默认数据源?至少这就是我的理解。

  2015-08-28 08:05:35.933  INFO 3764 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2015-08-28 08:05:35.943  INFO 3764 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]

这就是我运行我的应用程序的方式

 @SpringBootApplication
@Configuration
 @EnableAutoConfiguration(exclude = { DataSourceTransactionManagerAutoConfiguration.class,
DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })

public class Application extends SpringBootServletInitializer/*
                                                             * implements
                                                             * CommandLineRunner
                                                             */{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

这是第一个Config文件的样子:

  @Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "xx.xx.repository", entityManagerFactoryRef = "blueberryEntityManagerFactory", transactionManagerRef = "blueberryTransactionManager")
@PropertySource("classpath:application.properties")
public class DbConfigBlueBerry {

    @Value("${spring.datasourceblueberry.driver-class-name}")
    String driverClassName = "";
    @Value("${spring.datasourceblueberry.url}")
    String url = "";
    @Value("${spring.datasourceblueberry.username}")
    String userName = "";
    @Value("${spring.datasourceblueberry.password}")
    String password = "";

    @Bean(name = "blueberryEntityManager")
    public EntityManager entityManager() {
        return entityManagerFactory().createEntityManager();
    }

    @Bean(name = "blueberryEntityManagerFactory")
    public EntityManagerFactory entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(DataSourceBuilder.create().url(url)
                .driverClassName(driverClassName).username(userName)
                .password(password).build());

        factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
        factoryBean.setPackagesToScan(R.Blueberry_PACKAGE);
        factoryBean.setPersistenceUnitName("blueberryPersistenceUnit");
        Properties jpaProperties = new Properties();
        factoryBean.setJpaProperties(jpaProperties);
        factoryBean.afterPropertiesSet();

        return factoryBean.getObject();
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        jpaVendorAdapter.setDatabase(Database.MYSQL);
        jpaVendorAdapter.setGenerateDdl(true);
        jpaVendorAdapter.setShowSql(true);

        return jpaVendorAdapter;
    }

    @Bean(name = "blueberryTransactionManager")
    PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory());
    }

注意: LocalContainerEntityManagerFactoryBean也为我定义的数据源构建了entityManagerFactory,但是在构建了Default数据源之后。

  Building JPA container EntityManagerFactory for persistence unit 'blueberryPersistenceUnit'
2015-08-28 08:05:36.925  INFO 3764 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: blueberryPersistenceUnit
    ...]

我的怀疑 什么是Default PersistenceUnitInfo的意义? 从哪里构建Default PersistenceUnitInfo?我错过了什么?

请提供宝贵的意见。感谢。

0 个答案:

没有答案