在Spring中使用Hibernate 4
Posted Spring中文网
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Spring中使用Hibernate 4相关的知识,希望对你有一定的参考价值。
本文将重点介绍如何使用Spring配置Hibernate4 - 我们将看看如何使用XML和Java配置来使用Spring配置Hibernate4,这篇文章和在Spring中使用Hibernate 3相似。
Maven
要将Spring Persistence依赖项添加到项目pom.xml,请参阅使用Maven配置Spring文章。使用Hibernate 4,Maven依赖项很简单:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.6.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>
Hibernate 4的Java Spring配置
要在项目中使用Hibernate 4,在从Hibernate 3配置迁移时,配置方面的一些内容发生了变化。
从Hibernate 3升级时的主要方面是使用Hibernate 4创建SessionFactory的方法。
现在通过使用hibernate包中的LocalSessionFactoryBean来完成-它替换了hibernate3包中旧的AnnotationSessionFactoryBean。新的FactoryBean具有相同的职责 - 它从注解扫描引导SessionFactory。这是必要的,因为从Hibernate 3.6开始,旧的AnnotationConfiguration被合并到Configuration中,因此新的Hibernate 4 LocalSessionFactoryBean正在使用这种新的Configuration机制。
还值得一提的是,在Hibernate4中,Configuration.buildSessionFactory方法和机制也已被废弃取而代之的是Configuration.buildSessionFactory(ServiceRegistry)-Spring LocalSessionFactoryBean还没有使用。
使用Spring和Java配置Hibernate 4:
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "org.baeldung.spring.persistence" })
public class PersistenceConfig {
@Autowired
private Environment env;
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(
new String[] { "org.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"));
setProperty("hibernate.globally_quoted_identifiers",
"true");
}
};
}
}
Hibernate 4的XML Spring配置
同样,Hibernate 4也可以配置XML:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:property-placeholder location="classpath:persistence-mysql.properties" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="org.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="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>
要将XML引导到Spring Context中,如果应用程序配置了Java配置,我们可以使用简单的Java配置文件:
@Configuration
@EnableTransactionManagement
@ImportResource({ "classpath:hibernate4Config.xml" })
public class HibernateXmlConfig{
//
}
或者,如果整体配置纯粹是XML,我们可以简单地将XML文件提供给Spring Context。
对于这两种类型的配置,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
Spring,Hibernate和MySQL
Hibernate支持的驱动程序和方言已经在在Spring中使用Hibernate 3进行了说明 - 所有内容仍然适用于Hibernate 4。
用法
此时,Hibernate 4完全配置了Spring,我们可以在需要时直接注入原始的Hibernate SessionFactory:
public abstract class BarHibernateDAO{
@Autowired
SessionFactory sessionFactory;
...
protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
这里一个重要的注意事项是,现在这是使用Hibernate API的推荐方法 - 新的org.springframework.orm.hibernate4包中不再包含旧的HibernateTemplate,因为它不应该与Hibernate 4一起使用。
以上是关于在Spring中使用Hibernate 4的主要内容,如果未能解决你的问题,请参考以下文章
如何使用注解在 Hibernate 4 和 Spring 中定义不同类型的关系?
在树脂服务器上使用 Hibernate 5.4.1 的 Spring 5.0.7