1.概述

在本文中,我们将讨论如何使用Java代码和XML两种配置方式,集成Hibernate 5。

本文侧重于Spring MVC。如果想学习如何在Spring Boot中使用Hibernate,请跳转到Spring Boot 与 Hibernate

2.Spring集成

如果用原生Hibernate API配置 SessionFactory 很复杂,要写不少的代码(如需可以看看官方文档)。

而用Spring可以通过几行Java代码或XML配置,快速集成。

3. Maven依赖项

添加必要的依赖到 pom.xml 中 :

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.2.Final</version>
    </dependency>

spring-orm模块提供与Hibernate的Spring集成:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.1.6.RELEASE</version>
    </dependency>

为简单起见,我们将使用 H2 作为我们的数据库:

    <dependency>
        <groupId>com.h2database</groupId> 
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
    </dependency>

最后,我们将使用 tomcat jdbc连接池。相比Spring提供的 DriverManagerDataSource ,它更适合生产环境。

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-dbcp</artifactId>
        <version>9.0.1</version>
    </dependency>

4.配置

如前所述,Spring支持集成Hibernate SessionFactory

我们所要做的就是定义一些bean以及一些参数。

在Spring中,我们有两种方式配置,基于Java和基于XML的方式。

4.1.使用Java配置

Spring和Hibernate 5的集成,与Hibernate 4比只有一小点的变化:我们需要使用 org.springframework.orm.hibernate5 包中的LocalSessionFactoryBean 而非org.springframework.orm.hibernate4包中的。

与之前的Hibernate 4一样,我们必须为LocalSessionFactoryBeanDataSourcePlatformTransactionManager定义bean ,以及一些特定的Hibernate的属性。

下面创建 HibernateConfig 类,来集成Hibernate 5

    @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;
        }
    }

4.2.使用XML配置

作为第二选项,我们也可以通过基于XML的方式集成Hibernate 5

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="...">
    
        <bean id="sessionFactory" 
          class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource" 
              ref="dataSource"/>
            <property name="packagesToScan" 
              value="com.baeldung.hibernate.bootstrap.model"/>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.hbm2ddl.auto">
                        create-drop
                    </prop>
                    <prop key="hibernate.dialect">
                        org.hibernate.dialect.H2Dialect
                    </prop>
                </props>
            </property>
        </bean>
    
        <bean id="dataSource" 
          class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
            <property name="driverClassName" value="org.h2.Driver"/>
            <property name="url" value="jdbc:h2:mem:db;DB_CLOSE_DELAY=-1"/>
            <property name="username" value="sa"/>
            <property name="password" value="sa"/>
        </bean>
    
        <bean id="txManager" 
          class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
    </beans>

显而易见,我们正在定义与基于Java的配置完全相同的bean和参数。

要使XML配置生效,我们可以使用简单的Java配置引入:

    @Configuration
    @EnableTransactionManagement
    @ImportResource({"classpath:hibernate5Configuration.xml"})
    public class HibernateXMLConf {
        //
    }

5.使用

自此,Hibernate 5和Spring的集成已完成,我们可以在需要时直接注入原始的Hibernate SessionFactory

    public abstract class BarHibernateDAO {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        // ...
    }

6.支持的数据库

不幸的是,Hibernate没有列举受官方支持的数据库列表。

话虽如此,通过查看支持的数据库方言(dialect)列表,可以很容易的看出是否兼容某个数据库类型

7.总结

此教程中,我们通过XML和Java代码2种方式集成了Spring和Hibernate 5。

与本站其他教程一样,示例完整源代码存放在github