spring3.1与hibernate4集成配置

这是一篇翻译文章,原文:http://blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/

为Core-Spring 教程的一部分,我们有一个实验程序用来展示如何集成Spring和JPA/ Hibernate。我们刚刚升级到Spring3.1/ Hibernate的4.1,下面来分享一些技巧。


1)Maven依赖

下面的配置示例是基于Maven的(但如果需要,你可以很容易地转换到Gradle)。在POM中,你应该指定Spring和Hibernate的最新版本(可能还需要其它依赖,这取决于你的应用)。

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-orm</artifactId>
     <version>3.1.1.RELEASE</version>
     <!-- will come with all needed Spring dependencies such as spring-core and spring-beans-->
</dependency>
<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-entitymanager</artifactId>
     <version>4.1.1.Final</version>
     <!-- will come with Hibernate core-->
</dependency>
<dependency>
     <groupId>cglib</groupId>
     <artifactId>cglib</artifactId>
     <version>2.2.2</version>
     <scope>runtime</scope>
</dependency>

CGLIB的依赖并不总是需要。在后面会谈到更多细节。

2.A)Spring集成Hibernate的配置

Spring提供了几个版本的Hibernate的支持,所以你需要明确指定你使用的版本。

用Hibernate4:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
...
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"/>
</bean>
 

如果你是Hibernate 3的工作,你应该用:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
...
</bean>
 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"/>
</bean>
 

(包路径是不同的,取决于你用的是Hibernate3还是hibernate4)

使用Hibernate通常有2种常见映射方式:XML和注释。

Spring与Hibernate 3集成时,可以配置2 种SessionFactoryBean:

LocalSessionFactoryBean仅XML映射
AnnotationSessionFactoryBean可以使用XML映射和/或基于注解的映射


Spring3.1与Hibernate4集成时,事情变成简单了:只有一个称为LocalSessionFactoryBean的SessionFactoryBean。它可以基于注解或XML的映射方式。

如果您遵循上述2个步骤,你的程序应该可以运行了。


2.B)JPA Spring配置

如果不想直接使用Hibernate,也可以使用JPA作为Hibernate之上的抽象层。下面是一个例子:

<jdbc:embedded-database id="dataSource">
 <jdbc:script location="classpath:jpa/config/schema.sql" />
 </jdbc:embedded-database>
 
 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="jpaTest" />
    <property name="packagesToScan">
    <list>
       <value>jpa/config</value>
    </list>
    </property>
    <property name="jpaVendorAdapter">
       <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
          <property name="database" value="HSQL" />
       </bean>
    </property>
 </bean>
 
 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
 </bean>
 



3)你需要CGLIB依赖?

答案是很可能是“是”。通常Spring都需要它。下面是一些例子:

Java配置(@Bean @Configuration译者注)(详细信息:http://blog.springsource.org/2009/12/22/configuration-simplifications-in-spring-3-0/)

给没有实现接口的Spring bean添加事务行为,安全,缓存......(更多信息:http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html)

在做JUnit测试时使用@Transactional注解(这样做通常是让数据库的事务在测试用例结束后回滚,更多细节见这里:http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html)。

...
 

注意:CGLIB是一个无人维护的项目,很有可能从Spring3.2开始使用javassist作为替代。更多信息,请参阅https://jira.springsource.org/browse/SPR-5654 。因此,从Spring3.2开始,你可以添加Javassist依赖,而不是CGLIB。


4)Java配置

在Spring中使用Java配置是除了XML和注解配置之外的一个有趣选择。
那么,如何使用Java配置?一个称为LocalSessionFactoryBuilder的新类使事情变得很容易了。

@Bean
public SessionFactory sessionFactory() {
 return new LocalSessionFactoryBuilder(dataSource())
 .addAnnotatedClasses(Person.class, Account.class)
 .buildSessionFactory();
}
 

LocalSessionFactoryBuilder继承Hibernate的配置类,看类名字就知道,它提供一个方便的工厂方式的API,用于在Spring @Configuration类中使用。

所有上述示例代码可以在这里找到:https://github.com/michaelisvy/hibernate-4-spring-3.1-samples

最后:推荐一下我的编程电子书下载网站(不用注册啥的,里面放的是我收藏的比较优秀的电子书)E书家

前两天发布了hadoop,cassandra,mongodb电子书被投隐藏,这次发的“软文”不知道大家会不会又投隐藏呢?

猜你喜欢

转载自sunlong.iteye.com/blog/1495036