Contents

在 Spring 中 Hibernate 5

1.概述

在本文中,我们将讨论如何在 Spring 中 Hibernate 5,同时使用 Java 和 XML 配置。 本文重点介绍 Spring MVC。我们的文章 在 Spring Boot 中使用 Hibernate  描述了如何在 Spring Boot 中使用 Hibernate。

2. Spring集成

使用本机 Hibernate API引导SessionFactory有点复杂,需要我们编写好几行代码(如果您真的需要这样做,请查看官方文档 。 幸运的是,Spring支持引导SessionFactory——因此我们只需要几行 Java 代码或 XML 配置。

3. Maven依赖

让我们首先将必要的依赖项添加到我们的pom.xml中:

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

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

<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 配置

对于将 Hibernate 5 与 Spring 一起使用,自Hibernate 4 以来几乎没有变化:我们必须使用包org.springframework.orm.hibernate5中的LocalSessionFactoryBean而不是org.springframework.orm.hibernate4

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

让我们创建HibernateConfig类来使用 Spring 配置 Hibernate 5

@Configuration
@EnableTransactionManagement
public class HibernateConf {
    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(
          {"com.blogdemo.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.blogdemo.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>

正如我们很容易看到的那样,我们定义的 bean 和参数与前面基于 Java 的配置完全相同。 要将 XML 引导到 Spring 上下文中,如果应用程序配置了 Java 配置,我们可以使用一个简单的 Java 配置文件:

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

或者,如果整体配置是纯 XML,我们可以简单地将 XML 文件提供给 Spring 上下文。

5. 用法

至此,Hibernate 5 完全配置了 Spring,我们可以在需要时直接注入原始的 Hibernate SessionFactory

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

6. 支持的数据库

不幸的是,Hibernate 项目并没有完全提供支持数据库的官方列表。 话虽如此,很容易看出是否支持特定的数据库类型,我们可以查看支持的列表