1.概述
本文将重点介绍如何使用Spring设置Hibernate 4 - 我们将看看如何使用Java和XML配置来配置Spring with Hibernate 4。这个过程的一部分当然是Hibernate 3文章的共同点。
2. Maven
要将Spring Persistence依赖项添加到项目pom.xml,请参阅专注于Spring和Maven依赖项的文章。
继续使用Hibernate 4,Maven依赖很简单:
<dependency><font></font>
<groupId>org.hibernate</groupId><font></font>
<artifactId>hibernate-core</artifactId><font></font>
<version>4.3.6.Final</version><font></font>
</dependency>
然后,为了使Hibernate能够使用其代理模型,我们还需要javassist:
<dependency><font></font>
<groupId>org.javassist</groupId><font></font>
<artifactId>javassist</artifactId><font></font>
<version>3.18.2-GA</version><font></font>
</dependency>
由于我们将在本教程中使用MySQL,因此我们还需要:
<dependency><font></font>
<groupId>mysql</groupId><font></font>
<artifactId>mysql-connector-java</artifactId><font></font>
<version>5.1.32</version><font></font>
<scope>runtime</scope><font></font>
</dependency>
最后,我们使用正确的连接池而不是仅使用开发的Spring实现 - DriverManagerDataSource。我们在这里使用Tomcat JDBC连接池:
<dependency><font></font>
<groupId>org.apache.tomcat</groupId><font></font>
<artifactId>tomcat-dbcp</artifactId><font></font>
<version>7.0.55</version><font></font>
</dependency>
3. 用于Hibernate的Java Spring配置4
要在项目中使用Hibernate 4,在从Hibernate 3设置移动时,配置方面的一些事情已经发生了变化。
从Hibernate 3升级时的主要方面是使用Hibernate 4创建SessionFactory的方法。
现在,这是通过使用完成的LocalSessionFactoryBean从hibernate4它取代旧的-包AnnotationSessionFactoryBean从Hibernate3的包。新的FactoryBean具有相同的职责 - 它从注释扫描引导SessionFactory。这是必要的,因为从Hibernate 3.6开始,旧的AnnotationConfiguration 被合并到Configuration中,因此新的Hibernate 4 LocalSessionFactoryBean正在使用这个新的Configuration机制。
还值得一提的是,在Hibernate中4,Configuration.buildSessionFactory方法和机制也被否决 赞成的Configuration.buildSessionFactory(ServiceRegistry) -这春天LocalSessionFactoryBean中尚未使用。
Hibernate 4的Spring Java配置:
@Configuration<font></font>
@EnableTransactionManagement<font></font>
@PropertySource({ "classpath:persistence-mysql.properties" })<font></font>
@ComponentScan({ "org.baeldung.spring.persistence" })<font></font>
public class PersistenceConfig {<font></font>
<font></font>
@Autowired<font></font>
private Environment env;<font></font>
<font></font>
@Bean<font></font>
public LocalSessionFactoryBean sessionFactory() {<font></font>
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();<font></font>
sessionFactory.setDataSource(restDataSource());<font></font>
sessionFactory.setPackagesToScan(<font></font>
new String[] { "org.baeldung.spring.persistence.model" });<font></font>
sessionFactory.setHibernateProperties(hibernateProperties());<font></font>
<font></font>
return sessionFactory;<font></font>
}<font></font>
<font></font>
@Bean<font></font>
public DataSource restDataSource() {<font></font>
BasicDataSource dataSource = new BasicDataSource();<font></font>
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));<font></font>
dataSource.setUrl(env.getProperty("jdbc.url"));<font></font>
dataSource.setUsername(env.getProperty("jdbc.user"));<font></font>
dataSource.setPassword(env.getProperty("jdbc.pass"));<font></font>
<font></font>
return dataSource;<font></font>
}<font></font>
<font></font>
@Bean<font></font>
@Autowired<font></font>
public HibernateTransactionManager transactionManager(<font></font>
SessionFactory sessionFactory) {<font></font>
<font></font>
HibernateTransactionManager txManager<font></font>
= new HibernateTransactionManager();<font></font>
txManager.setSessionFactory(sessionFactory);<font></font>
<font></font>
return txManager;<font></font>
}<font></font>
<font></font>
@Bean<font></font>
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {<font></font>
return new PersistenceExceptionTranslationPostProcessor();<font></font>
}<font></font>
<font></font>
Properties hibernateProperties() {<font></font>
return new Properties() {<font></font>
{<font></font>
setProperty("hibernate.hbm2ddl.auto",<font></font>
env.getProperty("hibernate.hbm2ddl.auto"));<font></font>
setProperty("hibernate.dialect",<font></font>
env.getProperty("hibernate.dialect"));<font></font>
setProperty("hibernate.globally_quoted_identifiers",<font></font>
"true");<font></font>
}<font></font>
};<font></font>
}<font></font>
}
4. Hibernate的XML Spring配置4
同样,Hibernate 4也可以配置XML:
<context:property-placeholder location="classpath:persistence-mysql.properties" /><font></font>
<font></font>
<bean id="sessionFactory" <font></font>
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><font></font>
<property name="dataSource" ref="dataSource" /><font></font>
<property name="packagesToScan" value="org.baeldung.spring.persistence.model" /><font></font>
<property name="hibernateProperties"><font></font>
<props><font></font>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop><font></font>
<prop key="hibernate.dialect">${hibernate.dialect}</prop><font></font>
</props><font></font>
</property><font></font>
</bean><font></font>
<font></font>
<bean id="dataSource" <font></font>
class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"><font></font>
<property name="driverClassName" value="${jdbc.driverClassName}" /><font></font>
<property name="url" value="${jdbc.url}" /><font></font>
<property name="username" value="${jdbc.user}" /><font></font>
<property name="password" value="${jdbc.pass}" /><font></font>
</bean><font></font>
<font></font>
<bean id="transactionManager" <font></font>
class="org.springframework.orm.hibernate4.HibernateTransactionManager"><font></font>
<property name="sessionFactory" ref="sessionFactory" /><font></font>
</bean><font></font>
<font></font>
<bean id="persistenceExceptionTranslationPostProcessor" <font></font>
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
要将XML引导到Spring Context中,如果应用程序配置了Java配置,我们可以使用简单的Java配置文件:
@Configuration<font></font>
@EnableTransactionManagement<font></font>
@ImportResource({ "classpath:hibernate4Config.xml" })<font></font>
public class HibernateXmlConfig{<font></font>
//<font></font>
}
或者,如果整体配置纯粹是XML,我们可以简单地将XML文件提供给Spring Context。
对于这两种类型的配置,JDBC和Hibernate特定属性都存储在属性文件中:
# jdbc.X<font></font>
jdbc.driverClassName=com.mysql.jdbc.Driver<font></font>
jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true<font></font>
jdbc.user=tutorialuser<font></font>
jdbc.pass=tutorialmy5ql<font></font>
<font></font>
# hibernate.X<font></font>
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect<font></font>
hibernate.show_sql=false<font></font>
hibernate.hbm2ddl.auto=create-drop
5. Spring,Hibernate和MySQL
Hibernate支持的驱动程序和方言已经为Hibernate 3 进行了广泛讨论 - 所有内容仍然适用于Hibernate 4。
6.用法
此时,Hibernate 4完全配置了Spring,我们可以在需要时直接注入原始的Hibernate SessionFactory:
public abstract class BarHibernateDAO{<font></font>
<font></font>
@Autowired<font></font>
SessionFactory sessionFactory;<font></font>
<font></font>
...<font></font>
<font></font>
protected Session getCurrentSession(){<font></font>
return sessionFactory.getCurrentSession();<font></font>
}<font></font>
}
这里一个重要的注意事项是,现在这是使用Hibernate API的推荐方法 - 旧的org.springframework.orm.hibernate4包中不再包含旧的HibernateTemplate,因为它不应该与Hibernate 4一起使用。