Spring Template(3) ——ORM 设计与实现

通常情况下,ORM用的最多的是Hibernate。使用它,除了需要处理像Session、SessionFactory这些Hibernate类之外,还需要处理诸如事务处理、打开Session和关闭Session这样的问题,在某种程度上增加了使用Hibernate的难度。而Spring提供的Hibernate封装,如HibernateDaoSupport、HIbernateTemplate等,简化了这些通用过程。

Spring的ORM包提供了对许多ORM产品的支持。通常使用Spring提供的Template类。在这些模板类里,封装了主要的数据操作方法,比如query、update等,并且在Templdate封装中,已经包含了Hibernate中Session的处理,Connection的处理、事务的处理等。通过封装将Hibernate的持久化数据操作纳入到Spring统一的事务处理框架中,这部分是通过Spring的AOP来实现的。

类图:

DaoSupport是一个核心类,通过HIbernateTemplate支持对HIbernate的操作。

Spring的ORM模块并不是重新开发的,通过IOC容器和AOP模块对Hibernate的使用进行封装。使用HIbernate,需要对HIbernate进行配置,这些配置通过SessionFactory来完成,在Spring的HIbernate模块中,提供了LocalSessionFactoryBean来封装SessionFactory的配置,通过这个LocalSessionFactory封装,可以将SessionFactory的配置信息通过Bean定义,注入到IOC容器中实例化好的SessionFactory单例对象中。这个LocalSessionFactoryBean设计为HIbernate的使用奠定了基础。

以hibernateTemplate为例

与JdbcTemplate的使用类似,Spring使用相同的模式,通过execute回调来完成。如下:

代码

public <T> T execute(HibernateCallback<T> action) throws DataAccessException{
		return doExecute(action,false,false);
	}
	protected <T> T doExecute(HIbernateCallback<T> action,boolean enforceNewSession,boolean enforceNativeSession) throws DataAccessException{
		Assert.notNull(action,"Callback object must not be null");
		//这里是取得HIbernate的Session,判断是否强制需要新的Session,
		//如果需要,则直接通过SessionFactory打开一个新的session,否则需要结合配置和当前的Transaction的情况来使用Session
		Session session = (enforceNewSession ? SessionFactoryUtils.getNewSession(getSessionFactory(),getEntityInterceptor()):getSession());

		//判断Transaction是否已经存在,如果是,则使用的就是当前的Transaction的session
		boolean existingTransaction = (!enforceNewSession &&
				(!isAllowCreate()||SessionFactoryUtils.isSessionTransactional(session, getsessionFactory())));
		if(existingTransaction){
			logger.debug("Found thread-bound Session for HIbernateTemplate");
		}
		FlushMode previousFlushMode = null;
		try {
			previousFlushMode = applyFlushMOde(session,existingTransaction);
			enableFilters(session);
			Session sessionToExpose = (enforceNativeSession || isExposeNativeSession() ? session : createSessionProxy(session));
			//这里是对HIbernateCallback中回调函数的调用,Session作为参数可以由回调函数使用
			T result = action.doInHibernate(sessionToExpose);
			flushIfNecessary(session,existingTransaction);
			return result;
		} catch (HibernateException ex) {
			throw convertHibernateAccessException(ex);
		}catch(SQLException ex){
			throw convertJdbcAccessException(ex);
		}catch(RuntimeException ex){
			throw ex;
			//如果存在Transaction,当前回调完成使用完session后,不关闭这个session
		}finally{
			if(existingTransaction){
				logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
				disableFilters(session);
				if(previousFlushMode != null){
					session.setFlushMode(previousFlushMode);
				}
			}
			//如果不存在Transaction,那么关闭当前Session
			else{
				if(isAlwaysUseNewSession()){
					SessionFactoryUtils.closeSession(session);
				}else{
					SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session,getSessionFactory());
				}
			}
		}
	}

总结

Spring封装了事务处理,以及通过HIbernateTemplate封装了Session,不直接对Session进行操作。

Spring不提供具体的ORM实现,只为应用提供对ORM产品的集成环境和使用平台。并且Spring封装的Hibernate的API,方便了用户。

时间: 2024-10-05 05:20:51

Spring Template(3) ——ORM 设计与实现的相关文章

Spring源码阅读:Spring JDBC 组件的设计与实现

昨天回忆了我在学习JDBC时自己设计的JDBCTemplate(写在上一篇博客中),在使用Spring过程中,有时会用到Spring给我们提供的JdbcTemplate,这里看看Spring是如何实现这个组件的. 在使用Spring JDBC是你要做的工作很少: 从上面的图上可以看出来,使用Spring JDBC,你只需要做四个工作: 1)定义连接参数:也就是定义url,driver,user,password这个几个参数,一般我们会用一个jdbc.properties文件来配置. 2)指定要执

spring事务管理器设计思想(一)

首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 1.堆栈中存储值类型 2.堆栈实际上是向下填充,即由高内存地址指向低内存地址填充 3.堆栈的工作方式是先分配内存的变量后释放(先进后出原则) 4.堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突 5.堆栈的性能非常高,但是对于所有的变量来说还不灵活,而且变量的生命周期必须嵌套. 6.通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内

基于Spring的简易SSO设计

通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源的成熟sso项目(比如CAS),但如果觉得CAS太麻烦,想自己再造轮子重复发明一个,可以参考下面的思路:(仍然是基于Cookie的实现,只不过安全性上略有加强,cookie端存放的token标识,不再与用户名.密码等这些敏感信息相关) 1.组件图 主要由3大部分组成, 1.1 SSO Client

Spring源码阅读:使用标准AOP的API模拟Spring AOP + AspectJ的设计与实现

在上一篇博客中,提到了标准AOP与Spring AOP.这一篇就来把他们模拟出来. 在模拟之前,还需要提及的是,在Spring框架中,对于AOP的支持: Spring 支持的AOP AspectJ是另外一个有名的AOP框架,Spring也集成AspectJ,同时Spring AOP与AspectJ有一定程度的集成,这样一来Spring中就支持两种AOP:1)Spring AOP.2)AspectJ.而使用AOP的方式却又三种: 1)完全使用Spring AOP 2)完全使用AspectJ(分为注

PHP与Spring的强势接口设计_微课介绍

[back]  微课名称: PHP与Spring之间的强势接口设计  微课介绍:    PS.本頁建置中,請先閱讀博文:<<PHP与Spring之间的强势接口设计>> ~ End ~

Spring Jdbc 自定义 ORM——sql查询对应Java数据对象

Target:  实现如下,通过Spring Jdbc,传入sql,查询满足条件的Java数据对象: pojo: public class ZmTest { public ZmTest() { // TODO Auto-generated constructor stub } private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) {

Spring Cloud 微服务设计与实践

整理微服务设计与实践历程,共享给大家. 微服务的描述 The description of microserivce by Martin Fowler : 根据业务模块划分服务种类. 每个服务可以独立部署并且互相隔离. 通过轻量的 API 调用服务. 服务需要保证良好的高可用性. 微服务架构是以专注与单一责任的小功能模块为基础.通过 API 相互通信的方式完成复杂业务系统搭建的一种设计思想. 演变过程 单体架构(Monolithic) -> 垂直架构 -> SOA 架构 -> 微服务架构

详解 Spring Session 架构与设计

前言 开始进行 Web 开发时,您可能在使用 Session 时会碰到 Cookie 和 LocalStorage,被它们所干扰.因为他们都可以存储数据,有过期时间,不需要在使用时重新请求.您还会遇到这样的情况,Web 容器(例如 Tomcat.Jetty)包含 Session 的实现,当服务器重启之后,之前的登录状态会失效需要重新登录. 为什么需要 Spring SessionHTTP 协议 我们先从 HTTP 协议说起.HTTP 协议有个特点,是无状态的,意味着请求与请求是没有关系的.早期的

浅谈python web框架中的orm设计

看了一下廖雪峰的那个web框架,其实就是封装了web.py,请求使用异步并将aiomysql做为MySQL数据库提供了异步IO的驱动,前端部分则整合了jinja.其中最难的应该是orm部分了. 下面是orm一个简单的例子. class User(Model): __table__ = 'users' id = StringField(primary_key=True, default=next_id, ddl='varchar(50)') email = StringField(ddl='var