spring in action 5.Spring中集成Hibernate
2014-03-27 12:54
393 查看
延迟加载(Lazy Loading):我们只需要抓取所需要的数据。
预先抓取(Eager fetching):可以获取完整的关联对象,它在一个操作中将需要从数据库中的全部提取出来,节省了多次查询的成本。
级联(Cascading):更改数据库一张表同时修改其他表。
ORM:对象/关系映射 提供了这样的服务
Spring应用程序中使用Hibernate是通过HibernateTemplate进行的。
HibernateTemplate职责之一是管理Hibernate的Session。不足之处在于当我们在DAO中使用HibernateTemplate(直接使用,或者通过HibernateDaoSupport),DAO类会与SpringAPI产生耦合。
Hibernate3引入了上下文Session,这是其本身提供能保证每一个事物使用相同session的方案,而且能够让你的DAO不包含特定的Spring代码。
声明Hibernate的Session工厂:
org.hibernate.Session
此接口提供了基本数据访问功能,DAO能满足所有的持久化需要
〉〉〉通过XML文件配置Hibernate Session工厂Bean:----需要LocalSessionFactoryBean
〉〉〉通过注解配置Hibernate Session工厂Bean:----需要AnnotationSessionFactoryBean
当然如果想准确的指定少量的域类还可以使用annotatedClassses(形式和上面/**/中的一样),
而如果有很多域类或者不想更改spring配置自由添加移除域类,使用packagesToSan属性更合适。
解析:
@Autowired 可以让spring自动将一个SessionFactory注入到HibernateTestDao的sessionFactory属性中。通过currentSession()方法使用sessionFactory获取当前事务的Session。
@Repository 是Spring的另一种构造型注解,并且能被<context:component-scan>扫描到,就不用再声明HibernateTestDao Bean了。
配置:<context:component-scan base-package="com.ch.test.persistence"/>
它的另外一个任务:捕获平台相关异常,然后以spring的非检查型异常形式重新抛出。
如果我们使用Hibernate上下文Session,而不是用hibernate模版,异常转换处理方式如下:
给不使用模版的HibernateDAO添加异常转换功能:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
它会在所有标有@Repository的类上添加一个通知器(advisor)。
预先抓取(Eager fetching):可以获取完整的关联对象,它在一个操作中将需要从数据库中的全部提取出来,节省了多次查询的成本。
级联(Cascading):更改数据库一张表同时修改其他表。
ORM:对象/关系映射 提供了这样的服务
Spring应用程序中使用Hibernate是通过HibernateTemplate进行的。
HibernateTemplate职责之一是管理Hibernate的Session。不足之处在于当我们在DAO中使用HibernateTemplate(直接使用,或者通过HibernateDaoSupport),DAO类会与SpringAPI产生耦合。
Hibernate3引入了上下文Session,这是其本身提供能保证每一个事物使用相同session的方案,而且能够让你的DAO不包含特定的Spring代码。
声明Hibernate的Session工厂:
org.hibernate.Session
此接口提供了基本数据访问功能,DAO能满足所有的持久化需要
〉〉〉通过XML文件配置Hibernate Session工厂Bean:----需要LocalSessionFactoryBean
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mappingResources">//配置一个或多个hibernate映射文件 <list> <value>Test.hbm.xml</value> </list> </property> <property name="hibernateProperties>//配置hibernate如何操作的细节 <props> <prop key="dialect">org.hibernate.dialect.HSQLDialect</prop>//可以更换其他数据库的方言 </props> </property> </bean>
〉〉〉通过注解配置Hibernate Session工厂Bean:----需要AnnotationSessionFactoryBean
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> //这里不再列出hibernate配置文件,而是使用packagesToScan属性告诉Spring扫描多个包来查找。 //这些类使用JPA的@Entity或者@MappedSuperclass以及hibernate的@Entity标注,使其被包含 /*原本应该者没写: <property name="packagesToSan"> <list> <value>com.ch.test.domain</value> </list> </property> */ <property name="packagesToScan" value="com.ch.test.domain"/>//因为只扫描一个包,所以使用了内部属性 <property name="hibernateProperties>//配置hibernate如何操作的细节 <props> <prop key="dialect">org.hibernate.dialect.HSQLDialect</prop>//可以更换其他数据库的方言 </props> </property> </bean>
当然如果想准确的指定少量的域类还可以使用annotatedClassses(形式和上面/**/中的一样),
而如果有很多域类或者不想更改spring配置自由添加移除域类,使用packagesToSan属性更合适。
package com.ch.test; import.... @Repository public class HibernateTestDao implements TestDao{ private SessionFactory sessionFactory; @Autowired public HibernateTestDao(SessionFactory sessionFactory){ this.sessionFactory=sessionFactory; } public Session currentSession(){ return sessionFactory.getCurrentSession(); } public void addTest(Test test){ currentSession().save(spitter); } public Test getTestById(long id){ return (Test)currentSession().get(Test.class,id); } public void saveTest(Test test){ currentSession().update(test); } ... }
解析:
@Autowired 可以让spring自动将一个SessionFactory注入到HibernateTestDao的sessionFactory属性中。通过currentSession()方法使用sessionFactory获取当前事务的Session。
@Repository 是Spring的另一种构造型注解,并且能被<context:component-scan>扫描到,就不用再声明HibernateTestDao Bean了。
配置:<context:component-scan base-package="com.ch.test.persistence"/>
它的另外一个任务:捕获平台相关异常,然后以spring的非检查型异常形式重新抛出。
如果我们使用Hibernate上下文Session,而不是用hibernate模版,异常转换处理方式如下:
给不使用模版的HibernateDAO添加异常转换功能:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
它会在所有标有@Repository的类上添加一个通知器(advisor)。
相关文章推荐
- Spring集成Hibernate 《Srping in action》阅读笔记
- SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-001-使用Hibernate(@Inject、@EnableTransactionManagement、@Repository、PersistenceExceptionTranslationPostProcessor)
- Spring Integration in action 3 - 集成系统
- Spring in action笔记
- Spring In Action 00 ---Spring 之旅
- 在Spring3 MVC中五步配置集成注解方式Hibernate3
- S2SH的集成(Struts2,Spring,Hibernate)----青软S2SH(笔记)
- Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n
- Spring in Action(第三章 最小化 Spring XML配置)学习笔记
- struts2与spring集成时,关于Action类中成员bean自动注入的问题
- Spring/Hibernate/Proxool集成
- Hibernate data validator in spring integration
- 《Spring Microservices in Action》(Manning 2016)中文版目录
- maven 项目(三)引申--spring集成hibernate+JPA事务配置(扫描注解)
- 《Spring Microservices in Action》(Manning 2016)中文版下载地址
- Advising beans(Chapter 4 of Spring In Action)
- spring 集成hibernate和jdbcTemplate
- Spring in action--Part4-Integrating Spring
- hibernate-4.3.5 与Spring(Spring MVC4.0.4)注解方式集成
- 关于spring3.2.4与hibernate4.1.2 集成的一些注意事项以及配置