Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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/1/hibernate/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 使用2个hibernate会话工厂的Spring配置_Java_Hibernate_Spring Mvc - Fatal编程技术网

Java 使用2个hibernate会话工厂的Spring配置

Java 使用2个hibernate会话工厂的Spring配置,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我想使用2个hibernate db连接。我面临着这个错误,我试图解决,但找不到办法。我已经创建了两个不同的配置文件,并注释了@bean和@Qualifiers,但仍然不起作用 错误 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'transactionManager' defined in class path resource [com/proje

我想使用2个hibernate db连接。我面临着这个错误,我试图解决,但找不到办法。我已经创建了两个不同的配置文件,并注释了@bean和@Qualifiers,但仍然不起作用

错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'transactionManager' defined in class path resource [com/project/configuration/RepositoryConfiguration.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : No qualifying bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: sessionFactory2,sessionFactory; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: sessionFactory2,sessionFactory
我的配置:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:hibernate.properties" })
public class RepositoryConfig2 {

@Autowired
private Environment environment;

@Bean(name="sessionFactory2")
public LocalSessionFactoryBean sessionFactory2() {
    LocalSessionFactoryBean sessionFactory2 = new LocalSessionFactoryBean();
    sessionFactory2.setDataSource(dataSource2());
    sessionFactory2.setHibernateProperties(hibernateProperties());
    sessionFactory2.setPackagesToScan(new String[] { "com.project" });
    return sessionFactory2;
}

@Bean
public Properties hibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect2"));
    properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql2"));
    properties.put("hibernate.hbm2ddl.auto", "update");// environment.getRequiredProperty("hibernate.hbm2ddl.auto")
    return properties;
}

@Bean(name = "datasource2")
public DataSource dataSource2() {
    DriverManagerDataSource dataSource2 = new DriverManagerDataSource();
    dataSource2.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName2"));
    dataSource2.setUrl(environment.getRequiredProperty("jdbc.url2"));
    dataSource2.setUsername(environment.getRequiredProperty("jdbc.username2"));
    dataSource2.setPassword(environment.getRequiredProperty("jdbc.password2"));
    return dataSource2;
}


@Autowired
@Qualifier(value = "sessionFactory2")
public HibernateTransactionManager transactionManager(SessionFactory s) {
    HibernateTransactionManager txManager2 = new HibernateTransactionManager();
    txManager2.setSessionFactory(s);
    return txManager2;
}
}

第二种配置:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:hibernate.properties" })
public class RepositoryConfiguration {

@Autowired
private Environment environment;

@Bean(name="sessionFactory")
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setHibernateProperties(hibernateProperties());
    sessionFactory.setPackagesToScan(new String[] { "com.project" });
    return sessionFactory;
}

 @Bean
 public Properties hibernateProperties() {
 Properties properties = new Properties();
 properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
 properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
 properties.put("hibernate.hbm2ddl.auto", "update");// environment.getRequiredProperty("hibernate.hbm2ddl.auto")
 return properties;
 }

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

 @Bean
 @Autowired
 @Qualifier(value = "sessionFactory")
 public HibernateTransactionManager transactionManager(SessionFactory s) {
 HibernateTransactionManager txManager = new HibernateTransactionManager();
 txManager.setSessionFactory(s);
 return txManager;
 }

}

好吧,我做了更多的研发工作,幸运的是我解决了这个问题

这就是我所做的

  • 将我的RepositoryConfiguration合并到一个类中
  • 已从HibernateTransactionManager中删除自动连线和手动连线会话工厂
  • 还更改了扫描hibernate的包(意识到它将在两个数据库中创建相同的表)
  • 在@Transactional(从spring导入)中添加限定符

    在我的存储库中

    @Configuration
    @EnableTransactionManagement
    @PropertySource({ "classpath:hibernate.properties" })
    public class RepositoryConfiguration {
    
    @Autowired
    private Environment environment;
    
    @Bean(name = "sessionFactory")
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setHibernateProperties(hibernateProperties());
        sessionFactory.setPackagesToScan(new String[] { "com.project" });
        return sessionFactory;
    }
    
    @Bean
    public Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect",    environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.hbm2ddl.auto", "update");// environment.getRequiredProperty("hibernate.hbm2ddl.auto")
    return properties;
    }
    
    @Bean(name = "sessionFactory2")
    public LocalSessionFactoryBean sessionFactory2() {
        LocalSessionFactoryBean sessionFactory2 = new  LocalSessionFactoryBean();
        sessionFactory2.setDataSource(dataSource());
        sessionFactory2.setHibernateProperties(hibernateProperties2());
        sessionFactory2.setPackagesToScan(new String[] { "com.server" });
        return sessionFactory2;
    }
    
    @Bean
    public Properties hibernateProperties2() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect2"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql2"));
        properties.put("hibernate.hbm2ddl.auto", "update2");// environment.getRequiredProperty("hibernate.hbm2ddl.auto")
        return properties;
    }
    
    @Bean(name = "datasource2")
    public DataSource dataSource2() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName2"));
           dataSource.setUrl(environment.getRequiredProperty("jdbc.url2"));
       dataSource.setUsername(environment.getRequiredProperty("jdbc.username2"));
       dataSource.setPassword(environment.getRequiredProperty("jdbc.password2"));
        return dataSource;
    }
    
    @Bean(name = "datasource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
    dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
    dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
    return dataSource;
        }
    
    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;
    
    @Autowired
    @Qualifier("sessionFactory2")
    private SessionFactory sessionFactory2;
    
    @Bean(name = "sessionFactoryTransactionManager")
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(this.sessionFactory);
         return txManager;
    }
    
    @Bean(name = "sessionFactory2TransactionManager")
     public HibernateTransactionManager transactionManager2() {
        HibernateTransactionManager txManager2 = new HibernateTransactionManager();
        txManager2.setSessionFactory(this.sessionFactory2);
        return txManager2;
    }
    
    }
    

  • 为什么
    @Bean
    @Autowired
    使用相同的方法?是的,早就意识到了这一点。感谢问题的解决(大量研发)
    @Configuration
    @EnableTransactionManagement
    @PropertySource({ "classpath:hibernate.properties" })
    public class RepositoryConfiguration {
    
    @Autowired
    private Environment environment;
    
    @Bean(name = "sessionFactory")
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setHibernateProperties(hibernateProperties());
        sessionFactory.setPackagesToScan(new String[] { "com.project" });
        return sessionFactory;
    }
    
    @Bean
    public Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect",    environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.hbm2ddl.auto", "update");// environment.getRequiredProperty("hibernate.hbm2ddl.auto")
    return properties;
    }
    
    @Bean(name = "sessionFactory2")
    public LocalSessionFactoryBean sessionFactory2() {
        LocalSessionFactoryBean sessionFactory2 = new  LocalSessionFactoryBean();
        sessionFactory2.setDataSource(dataSource());
        sessionFactory2.setHibernateProperties(hibernateProperties2());
        sessionFactory2.setPackagesToScan(new String[] { "com.server" });
        return sessionFactory2;
    }
    
    @Bean
    public Properties hibernateProperties2() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect2"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql2"));
        properties.put("hibernate.hbm2ddl.auto", "update2");// environment.getRequiredProperty("hibernate.hbm2ddl.auto")
        return properties;
    }
    
    @Bean(name = "datasource2")
    public DataSource dataSource2() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName2"));
           dataSource.setUrl(environment.getRequiredProperty("jdbc.url2"));
       dataSource.setUsername(environment.getRequiredProperty("jdbc.username2"));
       dataSource.setPassword(environment.getRequiredProperty("jdbc.password2"));
        return dataSource;
    }
    
    @Bean(name = "datasource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
    dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
    dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
    return dataSource;
        }
    
    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;
    
    @Autowired
    @Qualifier("sessionFactory2")
    private SessionFactory sessionFactory2;
    
    @Bean(name = "sessionFactoryTransactionManager")
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(this.sessionFactory);
         return txManager;
    }
    
    @Bean(name = "sessionFactory2TransactionManager")
     public HibernateTransactionManager transactionManager2() {
        HibernateTransactionManager txManager2 = new HibernateTransactionManager();
        txManager2.setSessionFactory(this.sessionFactory2);
        return txManager2;
    }
    
    }