在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依赖项很简单:

 
   
   
 
  1. <dependency>

  2.   <groupId>org.hibernate</groupId>

  3.   <artifactId>hibernate-core</artifactId>

  4.   <version>4.3.6.Final</version>

  5. </dependency>

然后,为了使Hibernate能够使用其代理模型,我们还需要javassist:

 
   
   
 
  1. <dependency>

  2.   <groupId>org.javassist</groupId>

  3.   <artifactId>javassist</artifactId>

  4.   <version>3.18.2-GA</version>

  5. </dependency>

由于我们将在本教程中使用mysql,因此我们还需要:

 
   
   
 
  1. <dependency>

  2.   <groupId>mysql</groupId>

  3.   <artifactId>mysql-connector-java</artifactId>

  4.   <version>5.1.32</version>

  5.   <scope>runtime</scope>

  6. </dependency>

最后,我们将不会使用Spring数据源实现 - DriverManagerDataSource; 相反,我们将使用生产环境连接池解决方案 - Tomcat JDBC连接池:

 
   
   
 
  1. <dependency>

  2.    <groupId>org.apache.tomcat</groupId>

  3.    <artifactId>tomcat-dbcp</artifactId>

  4.    <version>7.0.55</version>

  5. </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:

 
   
   
 
  1. @Configuration

  2. @EnableTransactionManagement

  3. @PropertySource({ "classpath:persistence-mysql.properties" })

  4. @ComponentScan({ "org.baeldung.spring.persistence" })

  5. public class PersistenceConfig {

  6.   @Autowired

  7.   private Environment env;

  8.   @Bean

  9.   public LocalSessionFactoryBean sessionFactory() {

  10.      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

  11.      sessionFactory.setDataSource(restDataSource());

  12.      sessionFactory.setPackagesToScan(

  13.        new String[] { "org.baeldung.spring.persistence.model" });

  14.      sessionFactory.setHibernateProperties(hibernateProperties());

  15.      return sessionFactory;

  16.   }

  17.   @Bean

  18.   public DataSource restDataSource() {

  19.      BasicDataSource dataSource = new BasicDataSource();

  20.      dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));

  21.      dataSource.setUrl(env.getProperty("jdbc.url"));

  22.      dataSource.setUsername(env.getProperty("jdbc.user"));

  23.      dataSource.setPassword(env.getProperty("jdbc.pass"));

  24.      return dataSource;

  25.   }

  26.   @Bean

  27.   @Autowired

  28.   public HibernateTransactionManager transactionManager(

  29.     SessionFactory sessionFactory) {

  30.      HibernateTransactionManager txManager

  31.       = new HibernateTransactionManager();

  32.      txManager.setSessionFactory(sessionFactory);

  33.      return txManager;

  34.   }

  35.   @Bean

  36.   public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {

  37.      return new PersistenceExceptionTranslationPostProcessor();

  38.   }

  39.   Properties hibernateProperties() {

  40.      return new Properties() {

  41.         {

  42.            setProperty("hibernate.hbm2ddl.auto",

  43.              env.getProperty("hibernate.hbm2ddl.auto"));

  44.            setProperty("hibernate.dialect",

  45.              env.getProperty("hibernate.dialect"));

  46.            setProperty("hibernate.globally_quoted_identifiers",

  47.             "true");

  48.         }

  49.      };

  50.   }

  51. }

Hibernate 4的XML Spring配置

同样,Hibernate 4也可以配置XML:

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4.   xmlns:context="http://www.springframework.org/schema/context"

  5.   xsi:schemaLocation="

  6.      http://www.springframework.org/schema/beans

  7.      http://www.springframework.org/schema/beans/spring-beans-4.1.xsd

  8.      http://www.springframework.org/schema/context

  9.      http://www.springframework.org/schema/context/spring-context-4.1.xsd">

  10.   <context:property-placeholder location="classpath:persistence-mysql.properties" />

  11.   <bean id="sessionFactory"

  12.    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

  13.      <property name="dataSource" ref="dataSource" />

  14.      <property name="packagesToScan" value="org.baeldung.spring.persistence.model" />

  15.      <property name="hibernateProperties">

  16.         <props>

  17.            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>

  18.            <prop key="hibernate.dialect">${hibernate.dialect}</prop>

  19.         </props>

  20.      </property>

  21.   </bean>

  22.   <bean id="dataSource"

  23.    class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">

  24.      <property name="driverClassName" value="${jdbc.driverClassName}" />

  25.      <property name="url" value="${jdbc.url}" />

  26.      <property name="username" value="${jdbc.user}" />

  27.      <property name="password" value="${jdbc.pass}" />

  28.   </bean>

  29.   <bean id="transactionManager"

  30.    class="org.springframework.orm.hibernate4.HibernateTransactionManager">

  31.      <property name="sessionFactory" ref="sessionFactory" />

  32.   </bean>

  33.   <bean id="persistenceExceptionTranslationPostProcessor"

  34.    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

  35. </beans>

要将XML引导到Spring Context中,如果应用程序配置了Java配置,我们可以使用简单的Java配置文件:

 
   
   
 
  1. @Configuration

  2. @EnableTransactionManagement

  3. @ImportResource({ "classpath:hibernate4Config.xml" })

  4. public class HibernateXmlConfig{

  5.   //

  6. }

或者,如果整体配置纯粹是XML,我们可以简单地将XML文件提供给Spring Context。

对于这两种类型的配置,JDBC和Hibernate特定属性都存储在属性文件中:

 
   
   
 
  1. # jdbc.X

  2. jdbc.driverClassName=com.mysql.jdbc.Driver

  3. jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true

  4. jdbc.user=tutorialuser

  5. jdbc.pass=tutorialmy5ql

  6. # hibernate.X

  7. hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

  8. hibernate.show_sql=false

  9. hibernate.hbm2ddl.auto=create-drop

Spring,Hibernate和MySQL

Hibernate支持的驱动程序和方言已经在在Spring中使用Hibernate 3进行了说明 - 所有内容仍然适用于Hibernate 4。

用法

此时,Hibernate 4完全配置了Spring,我们可以在需要时直接注入原始的Hibernate SessionFactory:

 
   
   
 
  1. public abstract class BarHibernateDAO{

  2.   @Autowired

  3.   SessionFactory sessionFactory;

  4.   ...

  5.   protected Session getCurrentSession(){

  6.      return sessionFactory.getCurrentSession();

  7.   }

  8. }

这里一个重要的注意事项是,现在这是使用Hibernate API的推荐方法 - 新的org.springframework.orm.hibernate4包中不再包含旧的HibernateTemplate,因为它不应该与Hibernate 4一起使用。


以上是关于在Spring中使用Hibernate 4的主要内容,如果未能解决你的问题,请参考以下文章

如何使用注解在 Hibernate 4 和 Spring 中定义不同类型的关系?

Spring 5和hibernate 4兼容吗?

在树脂服务器上使用 Hibernate 5.4.1 的 Spring 5.0.7

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

hibernate 和eclipselink的区别

Spring 4.1.6 和 Hibernate 3.2.2?