programing

스프링 부팅 EntityManagerFactoryBuilder에 자동 전원이 필요하지 않습니다.

goodsources 2023. 4. 1. 09:07
반응형

스프링 부팅 EntityManagerFactoryBuilder에 자동 전원이 필요하지 않습니다.

Spring Boot 어플리케이션에서 여러 데이터베이스 연결을 설정하려고 합니다.프라이머리 데이터 소스 구축을 시작했는데 mySqlEntityManagerFactory 메서드에서 다음 오류가 발생합니다.

자동 배선을 할 수 없습니다.EntityManagerFactoryBuilder 콩 없음

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

}

Entity Manager Factory Builder 자동 연결 방법

이 블로그의 코드를 따르려고 합니다.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);
    }

}

잘못된 Import가 원인입니다.따라서 컨피규레이션클래스에서 간과되는 Import 섹션을 참조해 주십시오.springframework 클래스와 동일한 이름의 하이버네이트 클래스가 있습니다.당연히 봄을 골라야죠.

이 코드를 삭제해야 할 것 같습니다.

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

예외는 다음과 같습니다.public LocalContainerEntityManagerFactoryBean mySqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {기대했던 것 중 하나만을 필요로 한다EntityManagerFactoryBuilder.

참조 링크를 확인했는데, 그 코드가 기능할지는 잘 모르겠습니다.

일반적으로 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는 여러 데이터 소스를 필요로 하는 경우에만 필요합니다.하나뿐인 경우 주석을 제거하고 여러 데이터 소스가 필요할 때 주석을 추가합니다.

매개 변수 이름 변경builder로.entityManagerFactoryBuilderJpaBaseConfiguration.class에 존재하는 빈을 주입합니다.

'Data Source Auto Configuration' 제외를 삭제해 보셨습니까?

'@Enable' 사용AutoConfiguration(exclude={DataSourceAutoConfiguration.class})을(를) 사용하면 많은 콩이 생성되지 않습니다.

데이터 소스 사용 시 문제가 발생하여 이 솔루션을 추가하는 것이 올바른 솔루션이 아닐 수 있습니다.

스프링 부트는 클래스 패스에 특정 클래스의 존재를 검출하는 것에 주의해 주세요.maven을 사용하는 경우 모든 종속성의 모든 클래스를 읽는 것입니다.

따라서 이 DataSourceAutoConfiguration.class를 실행하는 것을 검토해 주십시오.

건배.

주 클래스가 "클래스 트리"의 맨 위에 있지 않을 수 있습니다.스프링은 (패키지 규칙에 따라) 메인 클래스부터 모든 클래스를 스캔해야 합니다.

https://www.baeldung.com/spring-component-scanning을 읽어보실 수 있습니다.

봄철 스캔으로 수업을 읽지 않으면 봄철의 맥락에 절대 들어가지 않습니다.

몇 가지 방법: 어플리케이션에 @EnableJpaRepositorys(basePackages = {"your.pkg.here"})를 추가해야 합니다.그러면 Spring Data가 지정된 패키지에서 저장소 클래스를 검색하도록 지시합니다.

여러 데이터 소스에서 @Primary를 삭제하면 문제가 해결되었습니다.

ide 소프트웨어 때문에 발생하였습니다.이러한 옵션을 설정해 주세요.

언급URL : https://stackoverflow.com/questions/33847095/spring-boot-entitymanagerfactorybuilder-not-autowired

반응형