SpingBoot 2.3.1はHibernate5を統合し、構成SessionFactoryメソッドを使用してBaseDaoコードとの互換性を実現します

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。

おすすめ

転載: blog.csdn.net/u011930054/article/details/106856750