![](/img/trans.png)
[英]Spring boot/ Hibernate application problems with multiple databases
[英]hibernate5 + spring boot connect multiple databases
我想用hibernate連接兩個不同的數據庫,使用不同的sessionfactory操作數據
在下面的示例中,@Configuration class 中將添加另一個數據源和 LocalSessionFactoryBean,但是如何為這兩個 sessionFactory 指定具體名稱?
https://www.baeldung.com/hibernate-5-spring
@Configuration
@EnableTransactionManagement
public class HibernateConf {
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(
{"com.baeldung.hibernate.bootstrap.model" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("sa");
return dataSource;
}
@Bean
public PlatformTransactionManager hibernateTransactionManager() {
HibernateTransactionManager transactionManager
= new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
private final Properties hibernateProperties() {
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty(
"hibernate.hbm2ddl.auto", "create-drop");
hibernateProperties.setProperty(
"hibernate.dialect", "org.hibernate.dialect.H2Dialect");
return hibernateProperties;
}
}
@Service
@Transactional
public class TestRepositoryImpl implements TestRepository{
@Qualifier("connectionA")
@Autowired
private SessionFactory sessionFactory;
@Qualifier("connectionB")
@Autowired
private SessionFactory sessionFactory;
...
...
}
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource test1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource test2DataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Autowired
@Bean(name = "test1Connection")
public NamedParameterJdbcTemplate test1JdbcTemplate(@Qualifier("test1DataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Autowired
@Bean(name ="test2Connection")
public NamedParameterJdbcTemplate test2JdbcTemplate(@Qualifier("test2DataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
}
任何幫助是極大的贊賞!
如果你想用兩個數據庫實現 hibernate:使用如下所示的 session 工廠。
但我建議使用 Spring 數據 JPA 它會給出更多規范並且更容易理解。
public class Transfer {
public static void main(String[] args) {
// get the SessionFacotry
SessionFactory connectionAFactory = HibernateConf.getSessionFactory();
SessionFactory connectionBFactory= DataSourceConfig.getSessionFactory();
// get The Session
Session connectionASes = HibernateConf.getSession();
Session connectionBSes = DataSourceConfig.getSession();
為此,您可以像這樣配置數據連接 bean:
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource test1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource test2DataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Autowired
@Bean(name = "test1Connection")
public NamedParameterJdbcTemplate test1JdbcTemplate(@Qualifier("test1DataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Autowired
@Bean(name ="test2Connection")
public NamedParameterJdbcTemplate test2JdbcTemplate(@Qualifier("test2DataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
}
之后,您可以在服務 class 中使用 @Qualifier 以下列方式分別自動裝配它們:
@Service
@Transactional
public class TestRepositoryImpl implements TestRepository{
@Qualifier("test1Connection")
@Autowired
private SessionFactory sessionFactory1;
@Qualifier("test2Connection")
@Autowired
private SessionFactory sessionFactory2;
...
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.