字段存储库需要找不到名为"entityManagerFactory"的bean [英] Field repository required a bean named 'entityManagerFactory' that could not be found

查看:507
本文介绍了字段存储库需要找不到名为"entityManagerFactory"的bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了几天时间尝试解决此错误,但没有成功.我正在尝试配置两个数据库并同时写入两个数据库.

I have spent some days trying to solve this error but without success. I am trying to configure two databases and write in both of them.

我看着:

https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7

https://www.baeldung.com/spring-data-jpa -多个数据库

https://www.devglan.com/spring -boot/spring-boot-multiple-database-configuration

https: //raymondhlee.wordpress.com/2015/10/31/configuring-multiple-jpa-entity-managers-in-spring-boot/

https://github.com/igormukhin/spring-boot-sample-data-jpa-multiple/blob/master/src/main/java/sample/data/jpa/Database1Configuration.java 还有更多来自SO的错误或类似示例链接.

https://github.com/igormukhin/spring-boot-sample-data-jpa-multiple/blob/master/src/main/java/sample/data/jpa/Database1Configuration.java And a loot more links from SO for the errors or similar examples.

这是我的代码:

fromDB.datasource.url=jdbc:h2:file:D:/test1/db1
fromDB.datasource.username=sa
fromDB.datasource.password=
fromDB.datasource.platform=h2
fromDB.datasource.driverClassName=org.h2.Driver

toDB.datasource.url=jdbc:h2:file:D:/test2/db2
toDB.datasource.username=sa
toDB.datasource.password=
toDB.datasource.platform=h2
toDB.datasource.driverClassName=org.h2.Driver

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.h2.console.settings.trace=true
spring.h2.console.settings.web-allow-others=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

休眠设置-hibernate.properties

Hibernate Settings -hibernate.properties

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=false
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.initialization-mode=always
spring.datasource.initialize=true
spring.jpa.generate-ddl=true

ConfigClasses

ConfigClasses

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
        entityManagerFactoryRef = "toEntityManager",
        transactionManagerRef = "toTransactionManager",
        basePackages = "leadTime.service"
    )
    public class ToDBConfig {

      @Bean
      @ConfigurationProperties(prefix = "toDB.datasource")
      public DataSource toDataSource() {
        return DataSourceBuilder
            .create()
            .build();
      }

      @Bean(name = "toEntityManager")
      public LocalContainerEntityManagerFactoryBean toEntityManagerFactory(
          EntityManagerFactoryBuilder builder) {
        return builder
            .dataSource(toDataSource())
            .properties(hibernateProperties())
            .packages(TestDataTo.class)
            .persistenceUnit("to")
            .build();
      }

      @Bean(name = "toTransactionManager")
      public PlatformTransactionManager toTransactionManager(@Qualifier("toEntityManager") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
      }

      private Map hibernateProperties() {

        Resource resource = new ClassPathResource("hibernate.properties");

        try {
          Properties properties = PropertiesLoaderUtils.loadProperties(resource);

          return properties.entrySet().stream()
              .collect(Collectors.toMap(
                  e -> e.getKey().toString(),
                  e -> e.getValue())
              );
        } catch (IOException e) {
          return new HashMap();
        }
      }
    }

第二个configClass

Second configClass

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
        entityManagerFactoryRef = "fromEntityManager",
        transactionManagerRef = "fromTransactionManager",
        basePackages = "leadTime.service"
    )
    public class FromDBConfig {

      @Primary
      @Bean
      @ConfigurationProperties(prefix = "fromDB.datasource")
      public DataSource fromDataSource() {
        return DataSourceBuilder
            .create()
            .build();
      }

      @Primary
      @Bean(name = "fromEntityManager")
      public LocalContainerEntityManagerFactoryBean fromEntityManagerFactory(
          EntityManagerFactoryBuilder builder) {
        return builder
            .dataSource(fromDataSource())
            .properties(hibernateProperties())
            .packages(TestDataFrom.class)
            .persistenceUnit("from")
            .build();
      }

      @Primary
      @Bean(name = "fromTransactionManager")
      public PlatformTransactionManager fromTransactionManager(@Qualifier("fromEntityManager") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
      }

      private Map hibernateProperties() {

        Resource resource = new ClassPathResource("hibernate.properties");

        try {
          Properties properties = PropertiesLoaderUtils.loadProperties(resource);

          return properties.entrySet().stream()
              .collect(Collectors.toMap(
                  e -> e.getKey().toString(),
                  e -> e.getValue())
              );
        } catch (IOException e) {
          return new HashMap();
        }
      }}

存储库:

    public interface ToRepository extends CrudRepository<TestDataTo, Integer> 
    {

      @Override
      TestDataTo save(TestDataTo testDataTo);
    }

DataInit:

    @Component
    public class DataInit {
      @Autowired
      ToRepository toRepository;

      @Autowired
      FromRepository fromRepository;

      @Transactional("fromTransactionManager")
      public void insertDataIntoFromDB() throws SQLException {
        TestDataFrom testDataFrom = new TestDataFrom();
        testDataFrom.setId(1);
        testDataFrom.setName("Test");
        fromRepository.save(testDataFrom);

      }
      //
      @Transactional("toTransactionManager")
      public void insertDataIntoToDB() throws SQLException {

        TestDataTo testDataTo = new TestDataTo();
        testDataTo.setId(1);
        testDataTo.setName("Ale");
        toRepository.save(testDataTo);
      }
    }

MainClass:

MainClass:

    @EnableTransactionManagement
    @SpringBootApplication
    public class LeadTimeApplication  {
      private Logger LOG = LoggerFactory.getLogger("LeadTimeApplication");

      @Autowired
      ToRepository toRepository;

      @Autowired
      FromRepository fromRepository;

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

      }

      @Autowired DataInit initializer;

      @PostConstruct
      public void init() throws  SQLException{

        initializer.insertDataIntoFromDB();
        initializer.insertDataIntoToDB();

      }

错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field toRepository in leadTime.LeadTimeApplication 
required a bean named 'entityManagerFactory' that could not be found.


Action:

Consider defining a bean named 'entityManagerFactory' in your configuration.

我尝试过: 使用

@EnableAutoConfiguration(exclude = { JpaRepositoriesAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})

老实说,我不知道该怎么办,我使用不同的方法多次重写了这段代码,但没有成功.如果我任其发展,无需配置新的entityManager和事务,也无需使用@Transactional,则该应用程序正在运行(已创建2个DB),但两个表均在同一个DB中创建(当然)

Honestly, I don't know what else to do, I re-wrote this code so many times using different approaches but without success. If I let spring to his job, without configuring new entityManagers and transactions and without using @Transactional, the application is working (2 DBs are created), but both tables are created in the sameDB (of course)

添加了gradle配置

Added gradle config

//Spring dependencies
compile "org.springframework.boot:spring-boot-starter- 
actuator:${springBootVersion}"
compile "org.springframework.boot:spring-boot-starter- 
web:${springBootVersion}"
compile "org.springframework.boot:spring-boot-starter- 
logging:${springBootVersion}"
compile "org.springframework.boot:spring-boot-configuration- 
processor:${springBootVersion}"


//JPA dependency
compile "org.springframework.boot:spring-boot-starter-data- 
jpa:${springBootVersion}"

testCompile "com.oracle:ojdbc7:12.1.0.2"
testCompile 'com.h2database:h2:1.4.194'
runtime 'com.h2database:h2:1.4.194'
//  compile group: 'h2', name: 'h2', version: '0.2.0'

compile group: 'org.hibernate', name: 'hibernate-entitymanager'
//compile group: 'org.hibernate', name: 'hibernate-gradle-plugin', version: 
'5.3.6.Final'
// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile group: 'org.hibernate', name: 'hibernate-core'

推荐答案

根据您粘贴的内容

https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7

其中一个darasource被配置为默认",另一个被命名.您正在创建两个带有fromto前缀的命名" bean. 更改fromEntityManagerfrom数据库定义entityManager,应该没问题.

One of the darasource is configured as "default" and another one is named. You are creating two "named" beans with from and to prefixes. Change eg from database definitions entityManager insteed of fromEntityManager and it should be fine.

我不知道内部原理,但就常识而言,您尝试的方法应该起作用,实际上,应用程序配置程序需要一些默认数据源,因此会出现错误.

I don't know the internals, but as for common sense, what you try should work, in practice some default datasource is required by app configurator thus the error.

这篇关于字段存储库需要找不到名为"entityManagerFactory"的bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆