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)JPASpring配置
如果不想直接使用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电子书被投隐藏,这次发的“软文”不知道大家会不会又投隐藏呢?