Guide to Hibernate 4 with Spring


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一起使用。