Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有多个数据源和外部配置的Spring引导,Spring JPA_Java_Spring_Jpa_Spring Boot_Spring Data - Fatal编程技术网

Java 具有多个数据源和外部配置的Spring引导,Spring JPA

Java 具有多个数据源和外部配置的Spring引导,Spring JPA,java,spring,jpa,spring-boot,spring-data,Java,Spring,Jpa,Spring Boot,Spring Data,我有一个简单的Spring启动应用程序,带有2个外部JAR。每个jar都使用SpringJPA,并且完全配置为独立工作 Jar1 JPA存储库 @Repository public interface QuarterRepository extends JpaRepository<Quarter, Long>{ } 配置 @Configuration @Import({RepositoryConfig.class}) public class OnlineJpaAppConfi

我有一个简单的Spring启动应用程序,带有2个外部JAR。每个jar都使用SpringJPA,并且完全配置为独立工作

Jar1

JPA存储库

@Repository
public interface QuarterRepository extends JpaRepository<Quarter, Long>{


}
配置

@Configuration
@Import({RepositoryConfig.class})
public class OnlineJpaAppConfig{

    @Bean(name = "onlinejpaAppConfigConfigurer")
    public static PropertyPlaceholderConfigurer getPropertyPlaceholderConfigurer()    {        
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocation(new ClassPathResource("/de/comp/onlinejpa/application.properties"));
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }
}  


@Configuration
@EnableJpaRepositories(basePackages = {"de.comp.onlinejpa.repository"},
        entityManagerFactoryRef = "onlinejpaentityManagerFactory",
        transactionManagerRef = "onlinejpaTransactionManager")
@EnableTransactionManagement
public class RepositoryConfig {

    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Value("${hibernate.dialect}")
    private String hibernateDialect;
    @Value("${hibernate.show_sql}")
    private String hibernateShowSql;
    @Value("${hibernate.hbm2ddl.auto}")
    private String hibernateHbm2ddlAuto;

    private static final String QUALIFIER = "onlinejpa";

    @Bean(name = "onlinejpaentityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(new String[]{"de.comp.onlinejpa.entity"});
        em.setPersistenceUnitName("onlinejpa");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;
    }

    @Bean(name = "onlinejpaDataSource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "onlinejpaTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier(value = "onlinejpaentityManagerFactory") EntityManagerFactory onlinejpaentityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(onlinejpaentityManagerFactory);

        return transactionManager;
    }

    @Bean(name = "onlinejpaExceptionTranslation")
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {

        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
        properties.setProperty("hibernate.dialect", hibernateDialect);
        return properties;
    }
}
除了bean和包名之外,第二个jar看起来几乎与Jar1相同

@EnableJpaRepositories(basePackages = {"de.comp.aisjpa.repository"}, 
        entityManagerFactoryRef = "aisjpaentityManagerFactory",
        transactionManagerRef = "aisjpatransactionManager")
@EnableTransactionManagement
public class RepositoryConfig {

    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Value("${hibernate.dialect}")
    private String hibernateDialect;
    @Value("${hibernate.show_sql}")
    private String hibernateShowSql;
    @Value("${hibernate.hbm2ddl.auto}")
    private String hibernateHbm2ddlAuto;

     private static final String QUALIFIER = "aisjpa";


    @Bean(name = "aisjpaentityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(aisdataSource());
        em.setPackagesToScan(new String[]{"de.comp.aisjpa.entity"});
        em.setPersistenceUnitName("ais");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;
    }



    @Bean(name = "aisjpadatasource")
    public DataSource aisdataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }


    @Bean(name = "aisjpatransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier(value = "aisjpaentityManagerFactory") EntityManagerFactory aisjpaentityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(aisjpaentityManagerFactory);

        return transactionManager;
    }


    @Bean(name = "aisjpaexceptionTranslation")
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
        properties.setProperty("hibernate.dialect", hibernateDialect);
        return properties;
    }
}
在Jar1中运行这个主类会得到预期的结果。。(与Jar2相同)

服务器启动时没有问题,但是在配置jpa的过程中出现了一些问题。持久化单元ais的配置应使用Oracle方言和驱动程序。它似乎选择了Jar1的配置

Building JPA container EntityManagerFactory for persistence unit 'onlinejpa'
HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
HHH000412: Hibernate Core {4.2.0.Final}
HHH000206: hibernate.properties not found
HHH000021: Bytecode provider name : javassist
HHH000204: Processing PersistenceUnitInfo [


HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
HHH000397: Using ASTQueryTranslatorFactory
Loaded JDBC driver: com.mysql.jdbc.Driver
Building JPA container EntityManagerFactory for persistence unit 'ais'
HHH000204: Processing PersistenceUnitInfo [


HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
HHH000400: Using dialect: **org.hibernate.dialect.MySQL5Dialect**
HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
HHH000397: Using ASTQueryTranslatorFactory
Loaded JDBC driver: com.mysql.jdbc.Driver
下一个问题是数据库访问。Spring不知道应该使用哪个事务管理器

: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: aisjpatransactionManager,onlinejpaTransactionManager
将一个tx管理器设置为@Primary可以解决上述问题,但最终在另一个库中找不到表,这是配置错误的tx管理器/持久化单元的原因

也许我的问题是为每个jar创建LocalContainerEntityManagerFactoryBean。相反,我应该使用以下代码来设置我的db连接,但这会破坏我的单个库

public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("hibernate.hbm2ddl.auto", "create");
    return builder
            .dataSource(internalDataSource())
            .packages("package here")
            .persistenceUnit("onlinjpa")
            .properties(properties)
            .build();
}
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
EntityManagerFactoryBuilder(建筑商){
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”、“create”);
返回生成器
.dataSource(internalDataSource())
.packages(“此处的packages”)
.persistenceUnit(“onlinjpa”)
.物业(物业)
.build();
}
如何使每个jar在Spring启动应用程序中工作

这里有一个使用SpingBoot设置多个数据源的链接,但我不想在Spring Boot应用程序中配置我的libs数据源


问题在于注入了错误的属性值,这可能是由每个jar中的
PropertyPlaceHolderConfigure
的静态调用引起的

任用

    @PropertySource("classpath:/de/comp/aisjpa/application.properties")
    public class RepositoryConfig

    @Autowired
    private Environment env;

    dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
    ....
或者保留对
PropertyPlaceHolderConfigure
的静态调用,但在application.properties中为属性添加前缀,以便每个属性值在整个应用程序中都是唯一的

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class } )
@Import({ KVLdapAppConfig.class, OnlineJpaAppConfig.class,AISAppConfig.class})

public class ServerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ServerApplication.class, args);
    }

}

public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("hibernate.hbm2ddl.auto", "create");
    return builder
            .dataSource(internalDataSource())
            .packages("package here")
            .persistenceUnit("onlinjpa")
            .properties(properties)
            .build();
}
    @PropertySource("classpath:/de/comp/aisjpa/application.properties")
    public class RepositoryConfig

    @Autowired
    private Environment env;

    dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
    ....
jdbc.driverClassName=oracle.jdbc.OracleDriver
jar1.jdbc.driverClassName=oracle.jdbc.OracleDriver