1. 概述
本文将重点介绍 Hibernate 3 与 Spring 的集成方案,涵盖使用 XML 和 Java 配置两种方式来整合 Spring、Hibernate 3 和 MySQL。
⚠️ 注意:本文针对 Hibernate 3 版本。如需了解最新版 Hibernate 的集成方案,请参考 Hibernate 5 与 Spring 集成。
2. Hibernate 3 的 Java Spring 配置
使用 Java 配置整合 Hibernate 3 和 Spring 非常直接:
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.google.common.base.Preconditions;
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "com.baeldung.spring.persistence" })
public class PersistenceConfig {
@Autowired
private Environment env;
@Bean
public AnnotationSessionFactoryBean sessionFactory() {
AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(new String[] { "com.baeldung.spring.persistence.model" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource restDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
Properties hibernateProperties() {
return new Properties() {
{
setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
}
};
}
}
与 XML 配置(下节详述)相比,Java 配置中有一个关键差异:配置类中引用其他 Bean 的方式。在 XML 中,引用 Bean 和引用 Bean 工厂没有区别。但 Java 配置是类型安全的,无法直接引用 Bean 工厂,需要手动获取:
txManager.setSessionFactory(sessionFactory().getObject());
3. Hibernate 3 的 XML Spring 配置
同样可以使用 XML 配置整合 Hibernate 3:
<context:property-placeholder location="classpath:persistence-mysql.properties" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.baeldung.spring.persistence.model" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.pass}" />
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
通过 @Configuration
类将 XML 配置引入 Spring 上下文:
@Configuration
@EnableTransactionManagement
@ImportResource({ "classpath:persistenceConfig.xml" })
public class PersistenceXmlConfig {
//
}
两种配置方式所需的 JDBC 和 Hibernate 属性都存储在以下属性文件中:
# jdbc.X
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true
jdbc.user=tutorialuser
jdbc.pass=tutorialmy5ql
# hibernate.X
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create-drop
4. Spring、Hibernate 与 MySQL 集成
上述示例使用 MySQL 5 作为底层数据库配置 Hibernate。Hibernate 支持多种 SQL 数据库。
4.1. 驱动配置
驱动类名通过 jdbc.driverClassName
属性配置到 DataSource。
示例中设置为 com.mysql.jdbc.Driver
,来自 pom 中定义的 mysql-connector-java
依赖。
4.2. 方言配置
方言通过 hibernate.dialect
属性配置到 Hibernate SessionFactory
。
示例中使用 org.hibernate.dialect.MySQL5Dialect
(对应 MySQL 5)。其他支持的 MySQL 方言包括:
-
org.hibernate.dialect.MySQL5InnoDBDialect
– MySQL 5.x + InnoDB 存储引擎 -
org.hibernate.dialect.MySQLDialect
– MySQL 5.x 之前版本 -
org.hibernate.dialect.MySQLInnoDBDialect
– MySQL 5.x 之前版本 + InnoDB -
org.hibernate.dialect.MySQLMyISAMDialect
– 所有 MySQL 版本 + ISAM 存储引擎
Hibernate 为所有支持的数据库提供了 SQL 方言。
5. 使用方式
至此,Hibernate 3 已完全集成到 Spring 中。可在需要时直接注入原始 Hibernate SessionFactory
:
public abstract class FooHibernateDAO{
@Autowired
SessionFactory sessionFactory;
...
protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
6. Maven 依赖
向 pom 添加 Spring 持久化依赖,参考 Spring with Maven 示例,需包含 spring-context
和 spring-orm
。
Hibernate 3 的 Maven 依赖很简单:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.10.Final</version>
</dependency>
为启用 Hibernate 代理模型,还需添加 javassist
:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
本教程使用 MySQL,需添加:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
<scope>runtime</scope>
</dependency>
最后,不使用 Spring 的 DriverManagerDataSource
,改用生产级连接池方案——Tomcat JDBC 连接池:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>7.0.55</version>
</dependency>
7. 总结
本文通过 Java 和 XML 两种配置方式实现了 Hibernate 3 与 Spring 的集成。完整示例代码可在 GitHub 项目 中获取,这是一个基于 Maven 的项目,可直接导入运行。