Spring Boot EntityManagerFactoryBuilder未自动装配

时间:2015-11-21 18:35:47

标签: java spring spring-boot

在Spring Boot应用程序中,我尝试设置多个数据库连接。我已经开始构建主数据源,但是我在mySqlEntityManagerFactory方法上遇到以下错误。

无法自动装配。没有EntityManagerFactoryBuilder的bean

import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@Transactional
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao",
        entityManagerFactoryRef = "entityManager",
        transactionManagerRef = "transactionManager")
public class PrimaryDBConfig {

    @Bean(name="dataSource")
    @Primary
    @ConfigurationProperties(prefix = "primary.datasource.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @PersistenceContext(unitName = "primary")
    @Primary
    @Bean(name = "entityManager")
    public LocalContainerEntityManagerFactoryBean mySqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(mysqlDataSource()).persistenceUnit("primary").properties(jpaProperties())
                .packages("digital.sheppard.model").build();
    }

    private Map<String, Object> jpaProperties() {
        Map<String, Object> props = new HashMap<String, Object>();
        props.put("hibernte.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
        props.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

        return props;
    }

}

我如何自动装配EntityManagerFactoryBuilder?

我试图关注此博客上的代码https://raymondhlee.wordpress.com/2015/10/31/configuring-multiple-jpa-entity-managers-in-spring-boot/

这是主要的应用课程,如果它有用

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan
public class Application extends SpringBootServletInitializer {

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

}

8 个答案:

答案 0 :(得分:0)

您是否尝试删除对“ DataSourceAutoConfiguration”的排除?

使用'@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})'可以防止创建大量的Bean。

如果在使用数据源并将其添加时遇到问题,也许这不是正确的解决方法。

知道Spring Boot会检测到类路径中某些类的存在。 如果您使用的是maven,它将从所有依赖项中读取所有类。

因此请考虑让此DataSourceAutoConfiguration.class运行;

欢呼

答案 1 :(得分:0)

我认为您应该删除此代码

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

答案 2 :(得分:0)

请注意,您的主类可能不在“类树”的顶部。 Spring需要从主类开始扫描属于子类的所有类(根据包约定)。

也许您会读https://www.baeldung.com/spring-component-scanning

如果Spring扫描未读取您的类,则它们永远不会进入Spring上下文。

答案 3 :(得分:0)

各种可能性: 您需要将@EnableJpaRepositories(basePackages = {“ your.pkg.here”})添加到Application中。这告诉Spring Data在指定的包下查找您的存储库类。

答案 4 :(得分:0)

该异常是由于public LocalContainerEntityManagerFactoryBean mySqlEntityManagerFactory(EntityManagerFactoryBuilder builder) { 期望使用EntityManagerFactoryBuilder的bean。

我检查了参考链接,不确定该代码是否有效。

通常,创建一个LocalContainerEntityManagerFactoryBean实例并根据需要对其进行初始化。您可以的话

  LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
  em.setDataSource(mysqlDataSource());
  em.setPersistenceUnitName("primary");
  em.setPackagesToScan(new String[] { "digital.sheppard.model" });

  JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
  em.setJpaVendorAdapter(vendorAdapter);
  em.setJpaProperties(jpaProperties());

持久性单元名称应与persistence.xml中定义的名称相同,尽管使用Spring JPA时该文件现在是可选的。

对于非春季版本,请查看https://stackoverflow.com/a/26814642/776548

  • 由于您要自己初始化EntityManagerFactory,因此我们 必须排除DataSourceAutoConfiguration.class
  • 仅在需要多个数据源时才需要
  • @Primary。如果只有一个,请考虑删除注释,并在需要多个数据源时添加注释

答案 5 :(得分:0)

将参数名称builder更改为entityManagerFactoryBuilder,以注入JpaBaseConfiguration.class中存在的bean

答案 6 :(得分:0)

对我来说,删除错误添加的多个数据源上的@Primary 解决了问题

答案 7 :(得分:-1)

它是由您的ide软件引起的,设置了这些选项 enter image description here