Bootstrapping Hibernate 5 with Spring


1.概述

在本文中,我们将讨论如何使用Java和XML配置来引导Hibernate 5和Spring。

2. Spring Integration

使用本机Hibernate API 引导SessionFactory有点复杂,并且需要我们使用相当多的代码(如果您真的需要这样做,请查看官方文档)。

幸运的是,Spring支持引导SessionFactory -因此我们只需要几行Java代码或XML配置。

另外,在我们进入之前,如果您正在使用旧版本的Hibernate,您可以查看有关Hibernate 3以及带有Spring的Hibernate 4的文章。

3. Maven Dependencies

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

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

该弹簧ORM模块提供了与Hibernate,Spring集成:

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

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

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

最后,我们将使用Tomcat JDBC连接池,它比Spring提供的DriverManagerDataSource更适合生产目的:

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

4.Configuration

如前所述,Spring支持我们引导Hibernate SessionFactory。

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

使用Spring,我们有两种选择来配置这些配置,即基于Java和基于XML的方式。

4.1.Using Java Configuration

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

与之前的Hibernate 4一样,我们必须为LocalSessionFactoryBean,DataSource和PlatformTransactionManager定义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.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引导到Spring上下文中,如果应用程序配置了Java配置,我们可以使用简单的Java配置文件:

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

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

5.Usage

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

public abstract class BarHibernateDAO {

    @Autowired
    private SessionFactory sessionFactory;

    // ...
}

6.支持的数据库

不幸的是,Hibernate项目并没有提供正式的受支持数据库列表。

话虽如此,很容易看出是否支持特定的数据库类型,我们可以查看支持的方言列表。