Spring整合Hibernate

1 概述

	Spring支持大多数流行的ORM框架,包括Hibernate、JDO、TopLink、Mybatis和JPA。
	Spring对这些ORM框架的支持是一致的,因此可以把和Hibernate整合技术应用到其他ORM框架上.
	Spring 2.0同时支持Hibernate 2.x和3.x。但Spring 2.5只支持Hibernate 3.1或更高版本。
	对于Hibernate而言,必须从原生的Hibernate API中构建SessionFactory。
	此外,应用程序也无法利用Spring提供的数据存储机制(例如:Spring的事务管理机制)
	Spring提供了对应的工厂bean,可以用单实例的形式在IOC容器中创建 SessionFactory实例。

2 配置SessionFactory

2.1 借助Hibernate自身的配置文件

可以利用LocalSessionFactoryBean工厂bean,声明一个使XML映射文件的 SessionFactory实例。
需要为该工厂bean指定configLocation属性来加载Hibernate配置文件。

在这里插入图片描述

2.2 使用IOC容器中的数据源

如果在Spring IOC容器中配置了数据源,可以将该数据源注入到 LocalSessionFactoryBean的dataSource属性中。该属性可以指定的数据源会覆盖掉 Hibernate配置文件里的相关配置。
在这里插入图片描述

2.3 不使用Hibernate自身的配置文件

可以将所有配置合并到LocalSessionFactoryBean中,从而忽略Hibernate配置文件。
可以在LocalSessionFactoryBean的mappingResources属性中指定XML映射文件的位置。该属性为String[]类型,因此可以指定一组映射文件。
在hibernateProperties属性中指定数据库方言等
在这里插入图片描述

3 ORM模板

在单独使用ORM框架时,必须为每个DAO操作重复某些常规任务。例如:打开关闭Session对象、启动,提交,回滚事务等。
同JDBC一样,Spring采取了相同的方法——定义模板类和Dao支持类来简化ORM 框架的使用。而且Spring在不同的事务管理API之上定义了一个事务抽象层。对于不同的ORM框架,只需要选择相应的事务管理器实现。
HibernateTemplate确保了Hibernate会话能够正确地打开和关闭。
HibernateTemplate也会让原生的Hibernate事务参与到Spring的事务管理体系中来。从而利用Spring的声明式事务管理事务。
Spring对不同数据存储策略的支持类:
在这里插入图片描述
HibernateTemplate中的模板方法管理会话和事务。如果在一个支持事务的Dao方法中有多个Hibernate操作,模板方法可以确保它们会在同一个会话和事务中运行。因此没有必要为了会话和事务管理去和Hibernate API打交道。
通过为Dao方法添加@Transactional注解将其声明为受事务管理的。
HibernateTemplate类是线程安全的,因此可以在bean配置文件中只声明一个实例,并将该实例注入到所有的Hibernate DAO中。

4 HibernateDaoSupport

Hibernate Dao可以通过继承HibernateDaoSupport来继承setSessionFactory()和setHibernateTemplate()方法。然后只要在Dao方法中调用getHibernateTemplate()方法就可以获取到模板实例。
如果为HibernateDaoSupport实现类注入了SessionFactory实例,就不需要在为之注入HibernateTemplate实例了,因为HibernateDaoSupport会根据传入的SessionFactory在其构造器内创建HibernateTemplate的实例,并赋给hibernateTemplate属性。

5 上下文Session

Spring的HibernateTemplate可以管理会话和事务,简化Dao实现。但使用 HibernateTemplate意味着Dao必须依赖于Spring的API。
代替HibernateTemplate的另一种办法是使用Hibernate的上下文Session对象。
Hibernate上下文Session对象和Spring的事务管理合作的很好,但此时需保证所有的Dao方法都支持事务。
注意此时不需在beans.xml文件中配置,因为Spring此时已经开始事务,所以已经在ThreadLocal对象中绑定了Session对象。

在Hibernate会话中调用原生的方法时,抛出的异常依旧是原生的HibernateException。
为了保持一致的异常处理方法,即把Hibernate异常转换为Spring的 DataAccessException异常。那么必须为需要异常转换的Dao类添加@Respository 注解。然后再注册一个org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor实例, 将原生的Hibernate异常转换为Spring的DataAccessException层次结构中的数据存取异常。这个bean后置处理器只为添加了@Respository注解的bean转换异常。
从Hibernate 3开始,SessionFactory新增加了getCurrentSession()方法,该方法可直接获取“上下文”相关的Session。
Hibernate通过CurrentSessionContext接口的实现类和 配置参数hibernate.current_session_context_class定义“上下文”。
JTASessionContext:根据JTA来跟踪和界定Session对象。
ThreadLocalSessionContext:通过当前正在执行的线程来跟踪和界定Session 对象
ManagedSessionContext:通过正在当前执行来跟踪和界定Session对象。但程序需要调用该类的静态方法来绑定Session 对象、取消绑定、flush或者关闭Session 对象。
如果使用ThreadLocalSessionContext策略,Hibernate的Session会随着 getCurrentSession()方法自动打开,随着事务提交自动关闭。
若当前应用是基于JTA的分布式事务,通常采用第一种方式;而对于独立的 Hibernate应用则使用第二种应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值