【问题标题】:Spring Boot 2.0.0.M4 & Hibernate 5.2.11.Final could not find bean of type EntityManagerFactoryBuilderSpring Boot 2.0.0.M4 & Hibernate 5.2.11.Final 找不到 EntityManagerFactoryBuilder 类型的 bean
【发布时间】:2018-03-16 10:15:06
【问题描述】:

我很清楚似乎是一些配置问题,但我自己无法解决这个问题。我希望你们能帮助我吗?

我发现没有一个示例表明必须为 EntityManagerFactoryBuilder 创建一个 bean,所以有什么问题。

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

我的错误:


应用程序启动失败


说明:

方法 entityManagerFactory 的参数 0 需要一个找不到的 'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' 类型的 bean。

行动:

考虑在你的配置中定义一个“org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder”类型的bean。

我的数据源配置

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
})

我的绒球

【问题讨论】:

  • 运气好能解决这个问题吗? 2.0.0.RELEASE 我也有同样的问题
  • 我确实有这个工作与 2.0.0.RELEASE 但那是很久以前我不记得我做了什么。我的数据源配置比较复杂,所以这里不能发。
  • 我在 2.1.1 RELEASE 中遇到了同样的问题

标签: spring-boot hibernate-5.x


【解决方案1】:

回答@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
})

【讨论】:

    【解决方案2】:

    通过排除HibernateJpaAutoConfiguration,您将关闭创建EntityManagerFactoryBuilder bean。

    默认EntityManagerFactoryBuilder bean 由JpaBaseConfiguration#entityManagerFactoryBuilder(JpaVendorAdapter, ObjectProvider) 生成。

    只有一个 JpaBaseConfiguration 实现 - HibernateJpaConfiguration,如果:

    • 只有一个DataSource候选(或一个标记为@Primary);
    • HibernateJpaAutoConfiguration 条件为真 - 检查 HibernateJpaAutoConfiguration 类。

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

    @Bean
    public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
        return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2018-06-12
      • 2018-03-13
      • 2018-03-16
      • 2017-11-05
      相关资源
      最近更新 更多