Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 为什么我可以访问两个数据源,尽管只设置了一个事务管理器?_Java_Spring Boot_Hibernate_Transactions_Spring Transactions - Fatal编程技术网

Java 为什么我可以访问两个数据源,尽管只设置了一个事务管理器?

Java 为什么我可以访问两个数据源,尽管只设置了一个事务管理器?,java,spring-boot,hibernate,transactions,spring-transactions,Java,Spring Boot,Hibernate,Transactions,Spring Transactions,我试图学习如何处理多个事务,但它们的行为对我来说真的不是直观的 我配置了两个不同的数据集和两个单独的配置(事务管理器+实体管理器) 应用程序属性 spring.datasource.url=jdbc:firebirdsql:111.111.111.1/7700:C:/dummy/dummy.fdb?encoding=WIN1250
 spring.datasource.driverClassName:org.firebirdsql.jdbc.FBDriver
 spring.datasource

我试图学习如何处理多个事务,但它们的行为对我来说真的不是直观的

我配置了两个不同的数据集和两个单独的配置(事务管理器+实体管理器)

应用程序属性

spring.datasource.url=jdbc:firebirdsql:111.111.111.1/7700:C:/dummy/dummy.fdb?encoding=WIN1250

spring.datasource.driverClassName:org.firebirdsql.jdbc.FBDriver

spring.datasource.username:username

spring.datasource.password:mypassword

spring.datasource80950.url=jdbc:firebirdsql:111.111.111.2/7700:C:/dummy/dummy2.fdb?encoding=WIN1250

spring.datasource80950.driverClassName:org.firebirdsql.jdbc.FBDriver
spring.datasource80950.username:username
spring.datasource80950.password:mypassword

spring.jpa.hibernate.ddl-auto:update

spring.jpa.show-sql: true

spring.jpa.properties.hibernate.format_sql=true

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.FirebirdDialect

第一种配置:

@Configuration
@EnableJpaRepositories(basePackages = {"com.lerkom.backend.defaultRepo"},
        entityManagerFactoryRef = "primaryEntityManager",
        transactionManagerRef = "primaryTransactionManager")
@EnableTransactionManagement
class PrimaryTsConfiguration {
 
    @Autowired
    Environment env;
 
    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan("com.backend.defaultRepo" );
 
        HibernateJpaVendorAdapter vendorAdapter
                = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect",
                env.getProperty("spring.jpa.hibernate.dialect"));
        em.setJpaPropertyMap(properties);
 
        return em;
    }
 
    @Bean(name = "defaultDs")
    @Primary
    public DataSource primaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }
 
    @Bean(name="primaryTransactionManager")
    @Autowired
    @Primary
    DataSourceTransactionManager primaryTransactionManager(@Qualifier("defaultDs") DataSource datasource) {
        DataSourceTransactionManager txm  = new DataSourceTransactionManager(datasource);
        return txm;
    }
}
@Configuration
@EnableJpaRepositories(basePackages = {"com.backend.nurseRepo"},
        entityManagerFactoryRef = "secondaryEntityManager",
        transactionManagerRef = "secondaryTransactionManager")
@EnableTransactionManagement
public class SecondaryTmConfiguration {
    @Autowired
    Environment env;
 
    @Bean
    public LocalContainerEntityManagerFactoryBean secondaryEntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(secondaryDataSource());
        em.setPackagesToScan("com.lerkom.backend.nurseRepo" );
 
        HibernateJpaVendorAdapter vendorAdapter
                = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect",
                env.getProperty("spring.jpa.hibernate.dialect"));
        em.setJpaPropertyMap(properties);
 
        return em;
    }
 
    @Bean(name = "secondDs")
    public DataSource secondaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource80950.driverClassName"));
        dataSource.setUrl(env.getProperty("spring.datasource80950.url"));
        dataSource.setUsername(env.getProperty("spring.datasource80950.username"));
        dataSource.setPassword(env.getProperty("spring.datasource80950.password"));
        return dataSource;
    }
 
    @Bean(name="secondaryTransactionManager")
    @Autowired
    DataSourceTransactionManager secondaryTransactionManager(@Qualifier ("secondDs") DataSource datasource) {
        DataSourceTransactionManager txm  = new DataSourceTransactionManager(datasource);
        return txm;
    }
}
@配置
@EnableJParepositions(basePackages={“com.lerkom.backend.defaultRepo”},
entityManagerFactoryRef=“primaryEntityManager”,
transactionManagerRef=“primaryTransactionManager”)
@启用事务管理
类主配置{
@自动连线
环境环境;
@豆子
@初级的
public LocalContainerEntityManagerFactoryBean primaryEntityManager(){
LocalContainerEntityManagerFactoryBean em
=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan(“com.backend.defaultRepo”);
冬眠盲蝽
=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”,
getProperty(“spring.jpa.hibernate.hbm2ddl.auto”);
properties.put(“hibernate.dial”,
env.getProperty(“spring.jpa.hibernate.dial”);
em.setJpaPropertyMap(属性);
返回em;
}
@Bean(name=“defaultDs”)
@初级的
公共数据源primaryDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“spring.dataSource.driverClassName”);
setUrl(env.getProperty(“spring.dataSource.url”);
setUsername(env.getProperty(“spring.dataSource.username”);
setPassword(env.getProperty(“spring.dataSource.password”);
返回数据源;
}
@Bean(name=“primaryTransactionManager”)
@自动连线
@初级的
数据源TransactionManager primaryTransactionManager(@Qualifier(“defaultDs”)数据源数据源){
DataSourceTransactionManager txm=新的DataSourceTransactionManager(数据源);
返回txm;
}
}
第二种配置:

@Configuration
@EnableJpaRepositories(basePackages = {"com.lerkom.backend.defaultRepo"},
        entityManagerFactoryRef = "primaryEntityManager",
        transactionManagerRef = "primaryTransactionManager")
@EnableTransactionManagement
class PrimaryTsConfiguration {
 
    @Autowired
    Environment env;
 
    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan("com.backend.defaultRepo" );
 
        HibernateJpaVendorAdapter vendorAdapter
                = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect",
                env.getProperty("spring.jpa.hibernate.dialect"));
        em.setJpaPropertyMap(properties);
 
        return em;
    }
 
    @Bean(name = "defaultDs")
    @Primary
    public DataSource primaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }
 
    @Bean(name="primaryTransactionManager")
    @Autowired
    @Primary
    DataSourceTransactionManager primaryTransactionManager(@Qualifier("defaultDs") DataSource datasource) {
        DataSourceTransactionManager txm  = new DataSourceTransactionManager(datasource);
        return txm;
    }
}
@Configuration
@EnableJpaRepositories(basePackages = {"com.backend.nurseRepo"},
        entityManagerFactoryRef = "secondaryEntityManager",
        transactionManagerRef = "secondaryTransactionManager")
@EnableTransactionManagement
public class SecondaryTmConfiguration {
    @Autowired
    Environment env;
 
    @Bean
    public LocalContainerEntityManagerFactoryBean secondaryEntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(secondaryDataSource());
        em.setPackagesToScan("com.lerkom.backend.nurseRepo" );
 
        HibernateJpaVendorAdapter vendorAdapter
                = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect",
                env.getProperty("spring.jpa.hibernate.dialect"));
        em.setJpaPropertyMap(properties);
 
        return em;
    }
 
    @Bean(name = "secondDs")
    public DataSource secondaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource80950.driverClassName"));
        dataSource.setUrl(env.getProperty("spring.datasource80950.url"));
        dataSource.setUsername(env.getProperty("spring.datasource80950.username"));
        dataSource.setPassword(env.getProperty("spring.datasource80950.password"));
        return dataSource;
    }
 
    @Bean(name="secondaryTransactionManager")
    @Autowired
    DataSourceTransactionManager secondaryTransactionManager(@Qualifier ("secondDs") DataSource datasource) {
        DataSourceTransactionManager txm  = new DataSourceTransactionManager(datasource);
        return txm;
    }
}
@配置
@EnableJpaRepositories(basePackages={“com.backend.nurseRepo”},
entityManagerFactoryRef=“secondaryEntityManager”,
transactionManagerRef=“secondaryTransactionManager”)
@启用事务管理
公共类SecondaryTmConfiguration{
@自动连线
环境环境;
@豆子
public LocalContainerEntityManagerFactoryBean secondaryEntityManager(){
LocalContainerEntityManagerFactoryBean em
=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(secondaryDataSource());
em.setPackagesToScan(“com.lerkom.backend.nurseRepo”);
冬眠盲蝽
=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”,
getProperty(“spring.jpa.hibernate.hbm2ddl.auto”);
properties.put(“hibernate.dial”,
env.getProperty(“spring.jpa.hibernate.dial”);
em.setJpaPropertyMap(属性);
返回em;
}
@Bean(name=“secondDs”)
公共数据源secondaryDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“spring.datasource80950.driverClassName”);
setUrl(env.getProperty(“spring.datasource80950.url”);
setUsername(env.getProperty(“spring.datasource80950.username”);
setPassword(env.getProperty(“spring.datasource80950.password”);
返回数据源;
}
@Bean(name=“secondaryTransactionManager”)
@自动连线
数据源TransactionManager secondaryTransactionManager(@Qualifier(“secondDs”)数据源数据源){
DataSourceTransactionManager txm=新的DataSourceTransactionManager(数据源);
返回txm;
}
}
然后,我在我的服务上使用@Transactional注释:

 
@Service
@Transactional("secondaryTransactionManager")
public class AlertService {
 
    @Autowired
    AlertsDao alertsDao;
    @Autowired
    OptionsDao optionsDao;
 
    public void test() {
        List<OptionsEntity> options = optionsDao.findAll();
        List<AlertsEntity> alerts = alertsDao.findAll();
    }
}

@服务
@事务性(“secondaryTransactionManager”)
公共类警报服务{
@自动连线
AlertsDao AlertsDao;
@自动连线
选项dao选项dao;
公开无效测试(){
List options=optionsDao.findAll();
List alerts=alertsDao.findAll();
}
}
在这里我真的很惊讶。我希望@Transactional上的设置(“secondaryTransactionManager”)只会打开到我的第二个数据源(名为secondDs)的连接。 但我同时获得选项和警报值。我不明白它如何从第一个数据源获取数据

DAO是一种假设

@Repository
public interface OptionsDao extends JpaRepository<OptionsEntity, String> {
 
}
@存储库
公共接口选项DAO扩展了JpaRepository{
}
@存储库
公共接口警报DAO扩展了JpaRepository{
}
请帮助我理解这一点:) 提前谢谢