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一样,我们必须为LocalSessionFactoryBean,DataSource和PlatformTransactionManager定义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。