SpringBoot 2.3.1はデフォルトでHibernateと統合されているため、JPAが使用され、JPA仕様には互換性がありません。SpringとHibernateの下位バージョンは、BaseDao操作データの読み取りを実装するために統合されています。ここでは、互換性は手動構成によって実現されます。
具体的な手順:
1。Hibernateを使用するには、最初にpom.xmlにいくつかの依存関係を導入する必要があります
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
HibernateはJPA仕様を使用して開発されているため、Springはjpaを使用してHibernateの導入に依存しています。jdbc依存関係の導入は必要ありません。
2.スタートアップエントランスの@SpringBootApplicationアノテーションでデータソース自動構成、JPA自動構成、およびhibernateJpa自動構成を除外するには、
コードは次のとおりです。
//启动时将数据源自动配置、JPA自动配置及hibernateJpa自动配置排除掉,如果不排除则将按照springboot的自动设置运行程序,自己写的配置hibernate配置无法生效
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
JpaRepositoriesAutoConfiguration.class,
HibernateJpaAutoConfiguration.class })
// 开启事务管理
@EnableTransactionManagement(proxyTargetClass = true)//启用注解事务,即可以使用@Transactional注解来控制事务等同于xml配置方式的 <tx:annotation-driven />
@EnableAspectJAutoProxy//允许AspectJ自动生成代理
public class HibernateproApplication {
public static void main(String[] args) {
SpringApplication.run(HibernateproApplication.class, args);
}
}
@EnableTransactionManagement(proxyTargetClass = true)の関数は、アノテーション付きトランザクションを有効にすることです。つまり、@ Transactionalアノテーションを使用して、xml構成モードと同等のトランザクションを制御できます<tx:annotation-driven />
@ EnableAspectJAutoProxy関数は次のとおりです。 AspectJがプロキシを自動的に生成し、@ Aspectに注釈を付けることを許可します。マークされたコンポーネントクラスはAOP関数を実装します。
3. application.properties構成ファイルでデータソースを構成します。次のコードは、2つのデータソースを使用して複数のデータソースを構成します。
app.datasource.first.driver-class-name=com.mysql.cj.jdbc.Driver
app.datasource.first.jdbc-url=jdbc:mysql://192.168.1.110:3306/lovemall?&serverTimezone=UTC&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
app.datasource.first.username=root
app.datasource.first.password=abc7048461
app.datasource.first.type=com.zaxxer.hikari.HikariDataSource
app.datasource.first.hikari.minimum-idle=5
app.datasource.first.hikari.maximum-pool-size=500
app.datasource.first.hikari.auto-commit=true
app.datasource.first.hikari.idle-timeout=30000
app.datasource.first.hikari.pool-name=DatebookHikariCP1
app.datasource.first.hikari.max-lifetime=1800000
app.datasource.first.hikari.connection-timeout=30000
app.datasource.first.hikari.connection-test-query=SELECT 1
app.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver
app.datasource.second.jdbc-url=jdbc:mysql://192.168.1.110:3306/lovemall?&serverTimezone=UTC&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
app.datasource.second.username=root
app.datasource.second.password=abc7048461
app.datasource.second.type=com.zaxxer.hikari.HikariDataSource
app.datasource.second.hikari.minimum-idle=5
app.datasource.second.hikari.maximum-pool-size=500
app.datasource.second.hikari.auto-commit=true
app.datasource.second.hikari.idle-timeout=30000
app.datasource.second.hikari.pool-name=DatebookHikariCP2
app.datasource.second.hikari.max-lifetime=1800000
app.datasource.second.hikari.connection-timeout=30000
app.datasource.second.hikari.connection-test-query=SELECT 1
springboot2.Xバージョンは、デフォルトでhikari接続プールを使用してデータベースに接続します。hikari属性は構成ファイルで構成されます。mysqlコネクター・ドライバーの上位バージョンはcom.mysql.cjに置き換えられることに注意してください。 jdbc.Driver。
4.データソースの構成を実現し、Java構成クラスを個別に宣言し、2つのデータソースのBeanを構成します。
@Configuration
public class HibernateDataSourceConfig {
//第一个数据源
@Bean(name = "firstDataSource")
@ConfigurationProperties(prefix = "app.datasource.first")//application.properties文件中前缀配置引用
@Primary//多个数据源时首先注入
public DataSource firstDataSource() {
return DataSourceBuilder.create().build();
}
//第二个数据源
@Bean(name="secondDataSource")
@ConfigurationProperties(prefix="app.datasource.second")//application.properties文件中前缀配置引用
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
}
コードから、2つのデータソースBeanが管理用のSpringコンテナに追加されていることがわかります。最初のデータソースはデフォルトのデータソース名firstDataSourceで、2番目のデータソース名はsecondDataSourceです。
5.データソースインジェクションを使用してHibernateのSessionFactoryを構成します。コードは次のとおりです。
@Configuration
public class HibernateSessionConfig {
//注入第一个数据源,生成sessionFactory
@Autowired
@Bean("sessionFactory")
@Primary
public LocalSessionFactoryBean getSessionFactory(@Qualifier("firstDataSource")DataSource dataSource) {
return buildLocalSessionFactory(dataSource);
}
/**
* 设置Hibernate的配置属性
* @return
*/
private Properties getHibernateProperties(){
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect","org.hibernate.dialect.MySQL55Dialect");
hibernateProperties.put("current_session_context_class", "org.springframework.orm.hibernate5.SpringSessionContext");
hibernateProperties.put("hibernate.show_sql", "true");
hibernateProperties.put("hibernate.format_sql", "false");
hibernateProperties.put("hibernate.hbm2ddl.auto", "update");
return hibernateProperties;
}
/**
* 构建LocalSessionFactoryBean实例
* @param dataSource 构建实例所使用的的数据源
* @return
*/
private LocalSessionFactoryBean buildLocalSessionFactory(DataSource dataSource){
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource); // 配置数据源,指定成第一个数据源
// 如果使用 xml 配置则使用该方法进行包扫描
//PathMatchingResourcePatternResolver pmprpr = new PathMatchingResourcePatternResolver();
//Resource[] resource = pmprpr.getResources("classpath*:com/ml/hibernatepro/ml/domain/*.hbm.xml");
//localSessionFactoryBean.setMappingLocations(resource);
// 现在配置基本都切换到 java config
//localSessionFactoryBean.setAnnotatedPackages("classpath*:com/ml/hibernatepro/ml/domain");
// 添加 Hibernate 配置规则
localSessionFactoryBean.setHibernateProperties(getHibernateProperties());
//指定需要扫描的hibernate的Entity实体类包名,可以指定多个包名
localSessionFactoryBean.setPackagesToScan("com.ml.hibernatepro.ml.domain");
return localSessionFactoryBean;
}
//注入第二个数据源生成secondSessionFactory
@Autowired
@Bean("secondSessionFactory")
public LocalSessionFactoryBean getSecondSessionFactory(@Qualifier("secondDataSource")DataSource dataSource) {
return buildLocalSessionFactory(dataSource);
}
}
コード分析を通じて、LocalSessionFactoryBeanが構成クラスでSessionFactoryを生成するために使用されていることがわかります。特定の実装は、XML構成が次の場合を除いて、Springの下位バージョンでのXML構成ファイルパラメーター構成の適応と一致しています。 java構成に置き換えられました。
このコードは、最初のデータソースfirstDataSourceを使用してsessionFactoryを生成し、2番目のデータソースsecondDataSourceを使用してsecondSessionFactoryを生成します。両方の休止状態のセッションファクトリが管理のためにSpringコンテナに追加されます。
6.前の手順で生成された2つのセッションファクトリBeanを使用して、それぞれ2つのトランザクションマネージャーを構成します。トランザクション構成クラスはTransactionManagementConfigurerインターフェイスを継承することに注意してください。このインターフェイスの機能は、デフォルトのトランザクションマネージャーを指定することです。注釈@Transactionalを使用する場合、トランザクション管理が指定されていません名前、デフォルトのトランザクションマネージャーが自動的に有効になります。名前を指定すると、指定したトランザクションマネージャが名前に従ってアクティブになります。
@Configuration
public class TransactionConfig implements TransactionManagementConfigurer {
//注入基于第一个数据源生成的会话工厂
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
// 事务管理交给 HibernateTransactionManager
//基于第一个数据源的事务管理
@Bean("transactionManager")
public HibernateTransactionManager getTransactionManager(){
HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
hibernateTransactionManager.setSessionFactory(sessionFactory);
return hibernateTransactionManager;
}
//实现接口 TransactionManagementConfigurer 方法,其返回值代表默认使用的事务管理器
//注意,此处返回的事务管理器就是@Transactional的默认值,如果不返回则需要指明@Transactional使用的事务管理器名称
//多事务管理器时指明@Transactional(value="transactionManager"),则代表使用的那个事务
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return getTransactionManager();
}
//注入基于第二个数据源生成的会话工厂
@Autowired
@Qualifier("secondSessionFactory")
private SessionFactory secondSessionFactory;
// 事务管理交给 HibernateTransactionManager
@Bean("queryTransactionManager")
public HibernateTransactionManager queryTransactionManager(){
HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
hibernateTransactionManager.setSessionFactory(secondSessionFactory);
return hibernateTransactionManager;
}
//DAO中使用的组件实例,在service中使用,主从数据库时负责查询
@Bean(name="queryDaoBulider")
public QueryDaoBuilder queryDaoBuilder(){
QueryDaoBuilder daoBuilder=new QueryDaoBuilder();
daoBuilder.setSessionFactory(secondSessionFactory);
return daoBuilder;
}
//DAO中使用的组件实例,在service中使用
@Bean(name="daoBuilder")
public DaoBuilder daoBuilder(){
DaoBuilder daoBuilder=new DaoBuilder();
daoBuilder.setSessionFactory(sessionFactory);
return daoBuilder;
}
}
コードの最後の2つのBean、daoBuilderとqueryDaoBuliderは、私のBaseDaoインターフェースで使用されているため、それらを参照する必要はありません。これまで、Hibernateとの統合にJPA仕様を使用しておらず、Hibernateの使用は従来のBaseDaoの使用と一致していることが十分に認識されています。
注:@SpringBootApplicationアノテーション付きクラスが配置されているパッケージおよびサブパッケージでは、@ Service、@ Component、@ Entityなどのアノテーション付きクラスを直接スキャンして、管理のためにSpringコンテナーに追加できます。作成する休止状態ファイルやその他のJavaファイルが前述の場所にない場合は、起動口で@ComponentScan(value = "io.mieux.controller")アノテーションを使用してください。コンテナ@ComponentScanに複数のパッケージスキャンを追加できます。アノテーションは同等です前のコンテキスト:component-scan。