Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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
Spring 使用miltiple数据源时,hibernate环境不工作_Spring_Hibernate_Spring Boot_Datasource_Hibernate Envers - Fatal编程技术网

Spring 使用miltiple数据源时,hibernate环境不工作

Spring 使用miltiple数据源时,hibernate环境不工作,spring,hibernate,spring-boot,datasource,hibernate-envers,Spring,Hibernate,Spring Boot,Datasource,Hibernate Envers,当我只使用一个数据源时,hibernate envers运行良好,不使用任何config.java。只需设置application.properties。但使用多个datasourcewith config.java、同一数据库、不同用户时,环境器不工作,并记录oracle错误消息ORA-00942。 已审核表位于DB1中。我该怎么办 弹簧靴1.5.6 应用程序属性 config.java defaultDO.java 首先在application.properties文件中为两个数据源添加hi

当我只使用一个数据源时,hibernate envers运行良好,不使用任何config.java。只需设置application.properties。但使用多个datasourcewith config.java、同一数据库、不同用户时,环境器不工作,并记录oracle错误消息ORA-00942。 已审核表位于DB1中。我该怎么办

弹簧靴1.5.6

应用程序属性

config.java

defaultDO.java


首先在application.properties文件中为两个数据源添加hibernate方言,如下所示:

spring.datasource.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
spring.secondDatasource.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
然后请像下面那样重写配置

package com.multisource.poc.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class ApplicationConfiguration {

    @Value("${spring.datasource.hibernate.dialect}")
    private String oracleDialect;

    @Value("${spring.secondDatasource.hibernate.dialect}")
    private String postgresDialect;

    @Primary
    @Bean(name = "oracleDB")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource oracleDataSource() {
        return  DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "oracleEM")
    public LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {

        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", oracleDialect);

        LocalContainerEntityManagerFactoryBean emf = builder
                .dataSource(oracleDataSource())
                .packages("entitypackageOne")
                .persistenceUnit("oraclePU")
                .build();

        emf.setJpaProperties(properties);

        return emf;

    }


    @Bean(name = "postgresDB")
    @ConfigurationProperties(prefix = "spring.secondDatasource")
    public DataSource postgresDataSource() {
        return  DataSourceBuilder.create().build();
    }

    @Bean(name = "postgresEM")
    public LocalContainerEntityManagerFactoryBean postgresEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", postgresDialect);

        LocalContainerEntityManagerFactoryBean emf = builder
                .dataSource(postgresDataSource())
                .packages("entitypackageTwo")
                .persistenceUnit("postgresPU")
                .build();

        emf.setJpaProperties(properties);

        return emf;
    }


}
现在您可以使用两个不同的EntityManager。样品应该是

@Repository
public class OracleDao implements InterOracle {

    private EntityManager entityManager;

    @Autowired
    public OracleDao(@Qualifier("oracleEM") EntityManager entityManager) {
        this.entityManager = entityManager;
    }

}


@Repository
public class PostgresDao implements InterPostGres{
    private static final Logger LOG
            = LoggerFactory.getLogger(PostgresDao.class);


    private EntityManager entityManager;

    @Autowired
    public PostgresDao(@Qualifier("postgresEM") EntityManager entityManager) {
        this.entityManager = entityManager;
    }

}

这就是我的应用程序使用两个不同数据源的工作方式。

首先在application.properties文件中为两个数据源添加hibernate方言,如下所示:

spring.datasource.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
spring.secondDatasource.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
然后请像下面那样重写配置

package com.multisource.poc.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class ApplicationConfiguration {

    @Value("${spring.datasource.hibernate.dialect}")
    private String oracleDialect;

    @Value("${spring.secondDatasource.hibernate.dialect}")
    private String postgresDialect;

    @Primary
    @Bean(name = "oracleDB")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource oracleDataSource() {
        return  DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "oracleEM")
    public LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {

        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", oracleDialect);

        LocalContainerEntityManagerFactoryBean emf = builder
                .dataSource(oracleDataSource())
                .packages("entitypackageOne")
                .persistenceUnit("oraclePU")
                .build();

        emf.setJpaProperties(properties);

        return emf;

    }


    @Bean(name = "postgresDB")
    @ConfigurationProperties(prefix = "spring.secondDatasource")
    public DataSource postgresDataSource() {
        return  DataSourceBuilder.create().build();
    }

    @Bean(name = "postgresEM")
    public LocalContainerEntityManagerFactoryBean postgresEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", postgresDialect);

        LocalContainerEntityManagerFactoryBean emf = builder
                .dataSource(postgresDataSource())
                .packages("entitypackageTwo")
                .persistenceUnit("postgresPU")
                .build();

        emf.setJpaProperties(properties);

        return emf;
    }


}
现在您可以使用两个不同的EntityManager。样品应该是

@Repository
public class OracleDao implements InterOracle {

    private EntityManager entityManager;

    @Autowired
    public OracleDao(@Qualifier("oracleEM") EntityManager entityManager) {
        this.entityManager = entityManager;
    }

}


@Repository
public class PostgresDao implements InterPostGres{
    private static final Logger LOG
            = LoggerFactory.getLogger(PostgresDao.class);


    private EntityManager entityManager;

    @Autowired
    public PostgresDao(@Qualifier("postgresEM") EntityManager entityManager) {
        this.entityManager = entityManager;
    }

}

这就是我的应用程序使用两个不同数据源的工作方式。

用户db_2/pw_2是否具有访问db所需的权限?

感谢您的回答!但它也不起作用。首先,当我在config.java中删除DefaultJpaRepositoriesConfig和ncrmJpaRepositoriesConfig方法时,会出现类似于[Duplicate'@ConfigurationProperties`前缀'db2.datasource'的定义]的错误。其次,像第一个一样删除,会出现类似以下错误:[com.dev.ext.audits.repo.CatAuditRepo中的Field catRepo需要一个名为“entityManagerFactory”的bean,但找不到该bean。]。这似乎没有回答问题。感谢您的回答!但它也不起作用。首先,当我删除config.java中的DefaultJpaRepositoriesConfig和ncrmJpaRepositoriesConfig方法时,会出现如下错误:[Duplicate'@ConfigurationProperties`前缀'db2.datasource'的定义]]第二步,像第一步一样删除,出现类似[com.dev.ext.audits.repo.CatAuditRepo中的字段catRepo需要一个名为'entityManagerFactory'的bean,但找不到该bean。]。这似乎没有回答问题。我想他们有。因为db_1和db_2是相同的db,但不同的用户。我可以读取db_1和db_2的数据。但只有db_1中的审核表数据没有加载。400错误+ORA-00942。检查/设置所需权限的方法是什么?您正试图使用不同的凭据登录到同一个db尝试使用SQLServer客户端登录,使用两个帐户并尝试从其中一个审计表中选择。我尝试连接两个用户并选择审核表。dBy1:从*By2.TabLE/dBy2中选择*:在SQL开发者中选择*从dBy1.AdditIt表,查询有效。我可以考虑其他设置吗?ng?您没有从相同的表中进行选择:从db_2.table中选择*从db_1.audit_table[db_1:audit_tbl//db_2:tbl][登录db_1]-从db_1.audit_tbl中选择*从db_2.tbl[登录db_2]-从db_1.audit_tbl中选择*从db_2.tbl中选择*我测试过,两者都可以工作…我认为它们都可以。因为db_1和db_2是相同的db,但用户不同。我可以读取db_1和db_2的数据。但是只有db_1中的审计表数据没有加载。400错误+ORA-00942。检查/设置所需权限的方法是什么?您正在尝试登录到e使用不同凭据(id_1/pw_1和DB_2/pw_2)的同一个DB。尝试使用SQL Developer客户端登录,例如,使用两个帐户并尝试从其中一个审核表中进行选择。我尝试连接两个用户并选择审核表。DB_1:select*from DB_2.table/DB_2:select*from DB_1.Audit_table在SQL Developer中,查询工作您不能从同一表中选择:从dBy2.TAB/SELECT*选择D*。-从db_1.audit_tbl中选择*/从db_2.tbl中选择*,我已测试,且两者均有效。。。