zoukankan      html  css  js  c++  java
  • 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作

    在上篇博客中学习ORM框架—hibernate(一):初识hibernate通过简单的实例说明O和R的映射过程。本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移。

    准备工作很重要,需要了解一些专业词汇,所谓专业词汇,意思大家都懂,只是在专业领域里起个专业的名称罢了。所以见到陌生东西时,应该尽可能的消除这种不必要的恐惧。

    先了解这个专业词汇

    何谓“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中。


    持久化对象有三种状态



    瞬时对象(Transient Objects):
    1. 使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,将由垃圾回收机制回收。 
    2. 没有被session管理
    3. 在数据库中没有与之匹配的记录

    持久化对象(Persist Objects):
    1. 纳入持久化管理器Session统一管理
    2. 持久实例是在事务中进行操作的,当事务提交时(在清理缓存时),通过执行SQL语句把内存中的状态同步到数据库中。
    3. 在数据库中有与之匹配的记录

    离线对象(Detached Objects):
    1. Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
    2. 在数据库中存在与之匹配的记录。


    使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移

    由transient状态到persist状态,完成insert操作
    由detached状态到persist状态,完成update操作

    public void testSave1(){
    		Session session = null;
    		User user = null;
    		
    		try {
    			session = HibernateUtils.getSession();
    			session.beginTransaction();
    			
    			// transient状态
    			user = new User();
    			user.setName("zhangsan");
    			user.setPassword("123");
    			
    			// persist状态
    			session.save(user);
    			
    			//Persistent状态的对象,如果对象的属性发生改变了
    			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
    			// 和数据库同步,体现在:当commit,开始清理缓存,使用快照比对的方式生成相应的sql语句,先insert,再update。
    			user.setName("lisi");
    			
    			//可以显示的调用update方法,但此时为持久状态,调用update没有什么意义
    			// session.update(user);
    			
    			session.getTransaction().commit();
    		} catch (Exception e) {
    			e.printStackTrace();
    			session.getTransaction().rollback();
    		} finally {
    			HibernateUtils.closeSession(session);
    		}
    		
    		// detached状态
    		user.setName("wangwu");
    		try {
    			session = HibernateUtils.getSession();
    			session.beginTransaction();
    			
    			//将detached状态的对象重新纳入session管理
    			//此时将变为persistent状态的对象
    			session.update(user);
    			
    			session.getTransaction().commit();
    		} catch (Exception e) {
    			e.printStackTrace();
    			session.getTransaction().rollback();
    		} finally {
    			HibernateUtils.closeSession(session);
    		}
    
    }
    



    掌握了状态变化,当处于某个状态时就知道可以进行何种操作了。比如当处于Transient状态,我们只能进行save、update操作或者被回收。

    Hibernate持久化是JPA规范的一种实现,还有其他实现方式,比如EJB的持久化,但大同小异,所以学好Hibernate的持久化,再学习其他的就更容易上手和理解了。

  • 相关阅读:
    js 正则表达式 test match exec三个方法的异同
    网页使用MD5加密
    解决Google地图和字体api无法加载的问题(转)
    Javascript 的addEventListener()及attachEvent()区别分析
    get与post的区别
    清除浮动的几种方法
    zoom属性(IE私有属性)
    class,id和name的区别
    深夜偷精之反射函数
    jQuery和js区别
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3167845.html
Copyright © 2011-2022 走看看