java - Spring jpa - 不能使用多个 EntityManagerFactory

标签 java hibernate spring-mvc jpa entitymanager

我正在开发一个 java spring mvc 应用程序,该应用程序使用 hibernate 和 jpa 作为持久层。我有 2 个数据库,我想映射数据库 1 中的一些实体表和数据库 2 中的一些实体表。所以我定义了两个这样的配置类:

第一:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(value = "com.mycompany.project.persistence.orm.module.common",entityManagerFactoryRef = "commonEntityManagerFactory",transactionManagerRef = "commonTransactionManager")
public class PersistenceConfigCommon {

    public PersistenceConfigCommon() {
    }


    Properties additionalProperties() {
        return new Properties() {
            {  
                setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
                setProperty("hibernate.hbm2ddl.auto", "update");
                setProperty("hibernate.show_sql", "true");
                setProperty("hibernate.enable_lazy_load_no_trans", "true");
                setProperty("hibernate.connection.CharSet", "utf8");
                setProperty("hibernate.connection.characterEncoding", "utf8");
                setProperty("hibernate.connection.useUnicode", "true");
            }
        };
    }

    @Primary
    @Bean(name = "commonEntityManagerFactory")
    public EntityManagerFactory commonEntityManagerFactory() {entityManagerFactoryBean");
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setPersistenceUnitName("common");
        factory.setDataSource(commonDataSource());
        factory.setPackagesToScan("com.mycompany.project.persistence.orm.module");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(Boolean.TRUE);
        vendorAdapter.setShowSql(Boolean.TRUE);
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setJpaProperties(additionalProperties());

        factory.afterPropertiesSet();
        return factory.getObject();
    }


    @Primary
    @Bean(name = "commonDataSource")
    public DataSource commonDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://10.10.1.11:3306/database1?characterEncoding=UTF-8");
        dataSource.setUsername("fpuser");
        dataSource.setPassword("fpdb$123456");

        return dataSource;
    }

    @Primary
    @Bean(name = "commonTransactionManager")
    public PlatformTransactionManager commonTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
           transactionManager.setEntityManagerFactory(commonEntityManagerFactory());
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

}

第二:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(value = "com.mycompany.project.persistence.orm.module.profile",entityManagerFactoryRef = "profileEntityManagerFactory",transactionManagerRef = "profileTransactionManager")
public class PersistenceConfigProfile {

    public PersistenceConfigProfile() {
    }


    Properties additionalProperties() {
        return new Properties() {
            {  
                setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
                setProperty("hibernate.hbm2ddl.auto", "update");
                setProperty("hibernate.show_sql", "true");
                setProperty("hibernate.enable_lazy_load_no_trans", "true");
                setProperty("hibernate.connection.CharSet", "utf8");
                setProperty("hibernate.connection.characterEncoding", "utf8");
                setProperty("hibernate.connection.useUnicode", "true");
            }
        };
     }

    @Primary
    @Bean(name = "profileEntityManagerFactory")
    public EntityManagerFactory profileEntityManagerFactory() {entityManagerFactoryBean");
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setPersistenceUnitName("profile");
        factory.setDataSource(profileDataSource());
        factory.setPackagesToScan("com.mycompany.project.persistence.orm.module");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(Boolean.TRUE);
        vendorAdapter.setShowSql(Boolean.TRUE);
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setJpaProperties(additionalProperties());

        factory.afterPropertiesSet();
        return factory.getObject();
    }


    @Primary
    @Bean(name = "profileDataSource")
    public DataSource profileDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://10.10.1.63:3306/database2?characterEncoding=UTF-8");
        dataSource.setUsername("fpuser");
        dataSource.setPassword("fpdb$123456");

        return dataSource;
    }

    @Primary
    @Bean(name = "profileTransactionManager")
    public PlatformTransactionManager commonTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
           transactionManager.setEntityManagerFactory(commonEntityManagerFactory());
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

}

请注意,这两个文件中的所有内容都很相似,只是第二个文件中的 common 已转换为 profile,并且数据库名称和 IP 已更改。我还在 DAO 中添加了以下内容:

@PersistenceContext(unitName = "common") //or "profile"
protected EntityManager entityManager;

@Override
public EntityManager getEntityManager() {
    return entityManager;
}

现在,当我运行该项目时,出现以下异常:

 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: commonEntityManagerFactory,profileEntityManagerFactory

我已经被这个异常困住了两天了。谁能帮我解决这个问题。感谢您抽出时间。

最佳答案

您尚未将“common”定义为unitName,并且您有两个@Primary注释。 尝试配置: @Bean(name = "common") 改为 @Bean(name = "commonEntityManagerFactory")

关于java - Spring jpa - 不能使用多个 EntityManagerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402091/

相关文章:

java - 如何使用 com.microsoft.azure.storage.blob.CloudBlockBlob 的 upload()

java - 在自动触发默认监听器之前触发 Hibernate 自定义事件监听器

hibernate - 如何将 Java 8 LocalDateTime 与 JPA 和 Hibernate 一起使用

java - 带集合的 Hibernate AliasToBean

java - Spring mvc Controller jsr 303基本列表验证

maven - spring-mvc return 语句中前导斜杠 ("/") 的含义

java - 更改Swagger中方法的主体请求中的参数

java - Google map v2 通过 Google Play 获取我的位置

java - Selenium webdriver ,带有 java 的 testNG

java - 用于删除两个字符之间的子字符串的正则表达式