`
sarin
  • 浏览: 1748047 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:172820
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:366550
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:188306
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:98742
社区版块
存档分类
最新评论

Spring数据库访问之ORM(三)

阅读更多
    本文接上一篇继续研究。
    之前我们使用的是HibernateTemplate来进行对象的持久化的,其实在DAO实现类中我们还可以使用Hibernate的上下文Session来持久化对象。也就是通过SessionFactory对象的getCurrentSession()对象来获得Session,然后通过Session来进行操作。
    我们调整一下代码:
package org.ourpioneer.course.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.ourpioneer.course.bean.Course;
import org.springframework.transaction.annotation.Transactional;
public class CourseDAOImplHibernate implements CourseDAO {
	private SessionFactory sessionFactory;
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	@Transactional
	public void delete(Course course) {
		sessionFactory.getCurrentSession().delete(course);
	}
	@Transactional(readOnly = true)
	public List<Course> findAll() {
		Query query = sessionFactory.getCurrentSession().createQuery(
				"from Course");
		return query.list();
	}
	@Transactional(readOnly = true)
	public Course findById(Long courseId) {
		return (Course) sessionFactory.getCurrentSession().get(Course.class,
				courseId);
	}
	@Transactional
	public void save(Course course) {
		sessionFactory.getCurrentSession().saveOrUpdate(course);
	}
	@Transactional
	public void update(Course course) {
		sessionFactory.getCurrentSession().update(course);
	}
}

    这里要注意的是所有DAO的方法必须是支持事务的,这可以通过添加Transactional注解来完成,就很简单了,之前也有过介绍。这样就能保证DAO中所有方法都可以在同一个Session,同一个事务内来执行,达到使用事务的效果。
    将代码修改完成后,就要来修改配置文件了:
<tx:annotation-driven />
	<bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<bean id="courseDaoHibernate" class="org.ourpioneer.course.dao.CourseDAOImplHibernate">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

    这样,基于上下文Session的持久化对象就配置完毕了,在示例程序中来执行,就会看到效果。修改测试程序如下:
package org.ourpioneer.course;
import java.util.GregorianCalendar;
import java.util.List;
import org.ourpioneer.course.bean.Course;
import org.ourpioneer.course.dao.CourseDAO;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
			 	"classpath:applicationContext.xml");
		CourseDAO courseDAO = (CourseDAO) ctx.getBean("courseDaoHibernate");
		Course course = new Course();
		course.setTitle("Spring ORM");
		course.setStartDate(new GregorianCalendar(2011, 2, 1).getTime());
		course.setEndDate(new GregorianCalendar(2011, 3, 1).getTime());
		course.setFee(100);
		courseDAO.save(course);
		List<Course> courses = courseDAO.findAll();
		Long courseId = courses.get(0).getId();
		course = courseDAO.findById(courseId);
		System.out.println(course);
		course.setFee(200);
		courseDAO.update(course);
		System.out.println(course);
		courseDAO.delete(course);
	}
}

    在控制台,我们可以看到如下输出:

    这种方式和使用HibernateTemplate有的不同是它们对异常的处理。HibernateTemplate会将异常统一翻译成Spring的数据访问异常体系中的某个异常,而我们使用上下文的Session时,抛出的就不是Spring的异常,而是HibernateException,如果我们还想看到Spring的异常体系,就需要做点设置,当然这也很简单。
    在DAO实现类上加@Respository注解,并且注册一个PersistenceExceptionTranslationPostProcessor实例即可。在Spring的配置文件中,我们加入如下内容:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"></bean>

    这是使用Hibernate的情况,那么使用JPA的情况和这个类似,我们来修改JPA的DAO实现类:
package org.ourpioneer.course.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.ourpioneer.course.bean.Course;
import org.springframework.transaction.annotation.Transactional;
public class CourseDAOImplJPA implements CourseDAO {
	@PersistenceContext
	private EntityManager entityManager;
	@Transactional
	public void delete(Course course) {
		entityManager.remove(entityManager.merge(course));
	}
	@Transactional(readOnly = true)
	public List<Course> findAll() {
		Query query = entityManager.createQuery("from Course");
		return query.getResultList();
	}
	@Transactional(readOnly = true)
	public Course findById(Long courseId) {
		return entityManager.find(Course.class, courseId);
	}
	@Transactional
	public void save(Course course) {
		entityManager.merge(course);
	}
	@Transactional
	public void update(Course course) {
		entityManager.merge(course);
	}
}

    这里我们使用注解来声明了EntityManager,那么需要在配置文件中在声明一个PersistenceAnnotationBeanPostProcessor实例就好了。配置文件修改为:
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	<bean id="courseDaoJPA" class="org.ourpioneer.course.dao.CourseDAOImplJPA" />
	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"></bean>

    之后,将测试程序中的getBean()换成courseDaoJPA即可。
    和HibernateTemplate一样,JpaTemplate也会将异常翻译为Spring的数据访问异常,而如果改成entityManagerFactory之后,异常就会变成Java SE的异常,比如非法参数,非法状态等异常。若要继续使用Spring的异常体系,那么要为JPA的DAO实现类加上@Repository注解,然后注册PersistenceExceptionTranslationPostProcessor实例。
    至此,我们的Spring的ORM部分已经全部介绍完了,源代码随附件发布。后续将介绍Spring对iBatis的支持
  • 大小: 73.8 KB
15
6
分享到:
评论

相关推荐

    Spring数据库访问之iBatis

    为了丰富博客专栏【Spring数据库访问系列】的内容,完善Spring数据库访问的体系,现在我们介绍Spring对iBatis的支持。相对于Hibernate等ORM框架的全自动SQL,那么iBatis则属于半自动化的ORM框架,我们需要编写SQL...

    快速学习-Spring Data JPA 之 ORM概述

    第1章 ORM概述[了解] ...当实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的。而使用ORM则会大大减少

    支持多数据库的ORM框架ef-orm.zip

    例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/...

    最新最全的spring开发包

    (8) spring-orm.jar 这个jar文件包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar...

    Uncode-DAL是 Java 通用数据访问组件基于mybatis、spring jdbc、hibernate等ORM框架开发

    Uncode-DAL是 Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate等ORM框架开发,同时支持基于多数据源的读写分离、主备切换、故障转移,自动恢复、负载均衡、缓存等。可以大大提高开发速度

    基于Spring的Simple Java Framework ,支持JPA和mybatis或PLUS ORM

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + ...它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    《精通Spring2.X企业应用开发详解》随书源码1-15章

    Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...

    spring基础进阶技巧200篇.zip

    数据访问:介绍了Spring框架对数据库访问的支持,包括JDBC、ORM框架、事务管理等。 测试和调试:介绍了如何使用Spring进行单元测试和集成测试,以及调试技巧和工具的使用。 这本资源适合已经具备一定Spring基础知识...

    Spring+3.x企业应用开发实战光盘源码(全)

     第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。  第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及...

    《精通Spring2.X企业应用开发详解》16-19章

    Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...

    《精通Spring2.X企业应用开发详解》20-23

    Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...

    跟开涛学Spring

    1.32 【第七章】 对JDBC的支持 之 7.3 关系数据库操作对象化 ——跟我学spring3 . . . . . . . . . . . . . .324 1.33 【第七章】 对JDBC的支持 之 7.4 Spring提供的其它帮助 ——跟我学spring3【私塾在线原 创】 ...

    基于java ssh框架实现机票订购管理系统v2附数据库文件+文档说明

    Web开发是为Internet(World Wide Web)或Intranet(私有网络)开发网站所...Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

    Spring.3.x企业应用开发实战(完整版).part2

    第11章 使用Spring JDBC访问数据库 11.1 使用Spring JDBC 11.1.1 JDBCTemplate小试牛刀 11.1.2 在DAO中使用JDBCTemplate 11.2 基本的数据操作 11.2.1 更改数据 11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据...

    spring in action英文版

     4.3 介绍Spring的ORM框架支持  4.4 用Spring整合Hibernate  4.4.1 Hibernate概览  4.4.2 管理Hibernate资源  4.4.3 用HibernateTemplate访问Hibernate  4.4.4 HibernateDaoSupport的子类  4.5 ...

    基于java SSM框架实现博客管理系统附数据库文件+文档说明

    Web开发是为Internet(World Wide Web)或Intranet(私有网络)开发网站所...Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

    Spring-Reference_zh_CN(Spring中文参考手册)

    12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 ...

    springDataJPA 概述.pdf

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封 装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据库 的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩 展!学习并使用 ...

Global site tag (gtag.js) - Google Analytics