使用JPA 2.1从来自两个不同模式的表中生成实体

时间:2018-10-17 13:21:37

标签: java spring-boot jpa database-schema

我目前正在尝试弄清如何在项目中使用两种不同的模式:目前,我可以从我在Eclipse上创建的两种不同的数据源中成功生成实体

Database Connection

基本上是同一台服务器,但是为了访问这两种模式,我不得不使用两个不同的连接字符串。 问题在于,通过切换连接以便从其他架构生成实体,无法识别先前的实体: Entities not recognized

有没有办法解决这个问题?无论如何,我有办法让我的实体得到认可吗?

编辑: 我最终创建了两个额外的JPA项目来生成我的实体,然后将这两个项目添加到主项目的POM中,但它仍然只读取一个持久性单元,而另一模式的实体则未被识别。

1 个答案:

答案 0 :(得分:0)

忘了回答这个问题,我终于找到了解决这个问题的方法。 在application.properties中,我们添加了模式modulessupplychain的属性,并为两个模式创建了2个JPA项目,并在那里生成了实体。 之后,我们在SpringServletInitializer中创建了bean:

    private Map<String, String> jpaProperties() {

    Map<String, String> p = new HashMap<String, String>();

    p.put("hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect"));
    p.put("hibernate.id.new_generator_mappings",
            env.getProperty("spring.jpa.properties.hibernate.id.new_generator_mappings"));
    p.put("hibernate.format_sql", env.getProperty("spring.jpa.properties.hibernate.format_sql"));
    p.put("hibernate.naming.physical-strategy", env.getProperty("spring.jpa.hibernate.naming.physical-strategy"));
    p.put("hibernate.ddl-auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));

    return p;
}



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

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

@Bean(name="modules")
public LocalContainerEntityManagerFactoryBean modulesEntityManagerFactory(
        org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder builder) throws IOException {
    return builder.dataSource(modulesDataSource()).packages(Moduli.class).properties(jpaProperties()).persistenceUnit("JPAModules").build();
}

@Bean(name="supplychain")
@Primary
public LocalContainerEntityManagerFactoryBean supplychainEntityManagerFactory(EntityManagerFactoryBuilder builder)
        throws IOException {
    return builder.dataSource(supplychainDataSource()).packages(Rent.class).properties(jpaProperties()).persistenceUnit("JPASupplychain").build();
}

@Bean(name = "modulesTransactionManager")
public PlatformTransactionManager modulesTransactionManager(EntityManagerFactoryBuilder builder)
        throws IOException {
    JpaTransactionManager tm = new JpaTransactionManager();
    tm.setEntityManagerFactory(modulesEntityManagerFactory(builder).getObject());
    tm.setDataSource(modulesDataSource());
    return tm;
}

@Bean(name = "supplychainTransactionManager")
@Primary
public PlatformTransactionManager supplychainTransactionManager(EntityManagerFactoryBuilder builder)
        throws IOException {
    JpaTransactionManager tm = new JpaTransactionManager();
    tm.setEntityManagerFactory(supplychainEntityManagerFactory(builder).getObject());
    tm.setDataSource(supplychainDataSource());
    return tm;
}

添加两个数据源,我终于可以使用两个持久性!