【问题标题】:No bean named 'entityManagerFactory' available into the primary datasource主数据源中没有名为“entityManagerFactory”的bean
【发布时间】:2020-03-20 06:23:36
【问题描述】:

我正在尝试使用 JNDI 将 Spring Boot 配置为使用 2 个数据源:

application.properties:

spring.production.datasource.jndi-name=java:/global/production_gateway
spring.production.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.production.datasource.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.production.datasource.jpa.show-sql = true
spring.production.datasource.jpa.hibernate.ddl-auto = update

spring.warehouse.datasource.jndi-name=java:/global/production_warehouse
spring.warehouse.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.warehouse.datasource.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.warehouse.datasource.jpa.show-sql = true
spring.warehouse.datasource.jpa.hibernate.ddl-auto = update

主数据源:

@Configuration
@EnableJpaRepositories(
        basePackages = "org.datalis.plugin.production.entity", 
        entityManagerFactoryRef = "productionEntityManager", 
        transactionManagerRef = "productionTransactionManager"
    )
@EnableTransactionManagement
public class ContextProductionDatasource {

    @Primary
    @Bean(name = "productionDataSourceProperties")
    @ConfigurationProperties(prefix="spring.production.datasource")
    public JndiPropertyHolder productionDataSourceProperties() {
        return new JndiPropertyHolder();
    }   

    @Primary
    @Bean(name = "productionDataSource")
    @ConfigurationProperties(prefix="spring.production.datasource")
    public DataSource productionDataSource() {        
        JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
        DataSource dataSource = dataSourceLookup.getDataSource(productionDataSourceProperties().getJndiName());
        return dataSource;
    }

    @Primary
    @Bean(name = "productionEntityManager") 
    public EntityManager productionEntityManager(EntityManagerFactory emf) {
        return emf.createEntityManager();
    }

    @Primary
    @PersistenceContext(unitName = "production")
    @Bean(name = "productionLocalEntityManager")
    public LocalContainerEntityManagerFactoryBean mySqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
         return  builder.dataSource(productionDataSource()).persistenceUnit("production").packages("org.datalis.plugin.production.entity").build();
    }

    @Primary
    @Bean(name = "productionTransactionManager")    
    public PlatformTransactionManager productionTransactionManager(final EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Primary
    @Bean(name = "productionExceptionTranslation")
    public PersistenceExceptionTranslationPostProcessor productionExceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    private static class JndiPropertyHolder {
        private String jndiName;

        public String getJndiName() {
            return jndiName;
        }

        public void setJndiName(String jndiName) {
            this.jndiName = jndiName;
        }
    }
}

我尝试这样使用实体管理器:

@Service
@Transactional(value = "productionEntityManager")
public class ..... {

    @PersistenceContext(unitName = "production")
    private EntityManager entityManager;
}

但我在部署过程中遇到错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available

你知道我的配置哪里错了吗?

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa


    【解决方案1】:

    您似乎缺少EntityManagerFactory 的 bean。你在这里请求它:

    public EntityManager productionEntityManager(EntityManagerFactory emf) {
    

    尝试添加

    @Primary
    @Bean(name = "productionEntityManagerFactory") 
    public EntityManagerFactory productionEntityManagerFactory() {
        return Persistence.createEntityManagerFactory("production");
    }
    

    【讨论】:

    • 现在我得到Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named production
    猜你喜欢
    • 2018-11-07
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2020-03-19
    • 2021-07-08
    • 2013-11-19
    • 2021-03-18
    相关资源
    最近更新 更多