代码之家  ›  专栏  ›  技术社区  ›  eztinkerdreams

弹簧护套2.0.0。M4和休眠5.2.11。Final找不到EntityManagerFactoryBuilder类型的bean

  •  6
  • eztinkerdreams  · 技术社区  · 9 年前

    我发现的例子中没有一个表明必须为EntityManagerFactoryBuilder创建bean,那么问题是什么呢。

    我试图配置完全独立的数据源,包括不同的实体管理器等。。

    我的错误:


    应用程序启动失败


    说明:

    方法entityManagerFactory的参数0需要“org”类型的bean。springframework。靴子orm。jpa。找不到EntityManagerFactoryBuilder“”。

    行动:

    考虑定义“org”类型的bean。springframework。靴子orm。jpa。EntityManagerFactoryBuilder”。

    我的数据源配置

    package ...;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import javax.sql.DataSource;
    
    @Configuration
    @EnableTransactionManagement
    public class DataSourceConfiguration {
    
    
        @Primary
        @Bean()
        @ConfigurationProperties(prefix="spring.my.datasource")
        public DataSource myDataSource() {
            return DataSourceBuilder.create().build();
        }
    
    
    
        @Primary
        @Bean(name = "myEntityManager")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder factoryBuilder,
                                                                           @Qualifier("myEntityManager") DataSource bds) {
            ...
        }
    }
    

    我的申请

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

    我的Pom

    2 回复  |  直到 9 年前
        1
  •  15
  •   Snarkovski    8 年前

    通过排除 HibernateJpaAutoConfiguration EntityManagerFactoryBuilder 豆

    EntityManagerFactoryBuilder 豆子是由 JpaBaseConfiguration#entityManagerFactoryBuilder(JpaVendorAdapter, ObjectProvider) .

    只有一个 JpaBaseConfiguration 实施- HibernateJpaConfiguration ,在以下情况下激活:

    • 只有一个 DataSource 候选人(或其中一人被标记为 @Primary
    • HibernateJPA自动配置 条件为真-检查 班

    您应该在没有生成器的情况下创建和配置LocalContainerEntityManagerFactoryBean(就像您在自己的答案中所做的那样),或者在配置中手动创建EntityManagerFactoryBuilder,如下所示:

    @Bean
    public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
        return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
    }
    
        2
  •  2
  •   eztinkerdreams    8 年前

    在回答@Albert Bos的问题时。。。

    我想这是怎么回事。

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
            basePackageClasses = { MyEntityRepository.class },
            repositoryBaseClass = EntityRepositoryImpl.class,
            transactionManagerRef = "myTransactionManager",
            entityManagerFactoryRef = "myEntityManagerFactory"
    )
    public class MyDataSourceConfiguration { ...
    

    @Bean(name = DATASOURCE_NAME + "DataSource")
    public DataSource dataSource(@Qualifier(DATASOURCE_NAME + "DataSourceProperties") DataSourceProperties dataSourceProperties) 
    {
        return DataSourceBuilder.create()
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword())
                .driverClassName(dataSourceProperties.getDriverClassName())
                .build();
    }
    
    @Bean(name = DATASOURCE_NAME + "EntityManagerFactory")
    @PersistenceContext(unitName = DATASOURCE_NAME + "PersistenceUnit")
    public EntityManagerFactory entityManagerFactory(
            @Qualifier(DATASOURCE_NAME + "JpaProperties") Properties jpaProperties,
            @Qualifier(DATASOURCE_NAME + "DataSource") DataSource dataSource,
            @Qualifier(DATASOURCE_NAME + "JpaVendorAdapter") JpaVendorAdapter jpaVendorAdapter) 
    {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setJpaProperties(jpaProperties);
        factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
        factoryBean.setPackagesToScan(MyEntity.class.getPackage().getName());
        factoryBean.setPersistenceUnitName(DATASOURCE_NAME + "PersistenceUnit");
        factoryBean.afterPropertiesSet();
        return factoryBean.getObject();
    }
    
    @Bean(name = DATASOURCE_NAME + "TransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier(DATASOURCE_NAME + "EntityManagerFactory") EntityManagerFactory entityManagerFactory) 
    {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory);
        return txManager;
    }
    

    和应用程序配置

    @SpringBootApplication(exclude = {
            LiquibaseAutoConfiguration.class,
            DataSourceAutoConfiguration.class,
            ValidationAutoConfiguration.class,
            HibernateJpaAutoConfiguration.class,
            JpaRepositoriesAutoConfiguration.class,
            DataSourceTransactionManagerAutoConfiguration.class
    })