【SSH框架】--Hibernate持久化对象的三种状态
2016-02-12 20:11
363 查看
Hibernate是一个开放源代码的对象映射框架,对JDBC进行了非常轻量级的对象封装。持久化是将程序数据在持久状态和瞬时状态间转换的机制。持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在的数据库中,或者存储在磁盘文件中、XML数据文件中等等。
Hibernate持久化对象有三种状态,Transient状态(瞬时状态),Persistent状态(持久化状态)Detached对象(离线状态)。
持久化对象的生命周期:
Transient状态:通过session的save()方法和saveorUpdate()方法可以把一个临时对象和数据相关联,并把临时对象携带的信息通过配置文件所做的映射插入到数据库中,临时对象转化为持久化对象。
Persistent状态:持久化对象总是与Session和Transaction关联在一起,在一个session中,对持久化对象的操作不会立即写到数据库,只有当Transaction(事务)结束时,才真正的对数据库更新,从而完成持久化对象和数据库的同步。在同步之前的持久化对象成为脏对象。当一个session()执行close()、Clear()、或Evict()之后,持久化对象就变为离线对象.
Detached对象:Session关闭之后,与此Session关联的持久化对象就变成为脱管对象,可以继续对这个对象进行修改,如果脱管对象被重新关联到某个新的Session上,会在此转成持久对象。脱管对象虽然拥有用户的标识id,所以通过update()、saveOrUpdate()等方法,再次与持久层关联。
如下代码来分析Hibernate持久化对象的三种状态:
当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。当应用程序显示调用Session的flush()方法的时候会清除缓存。
简而言之:
对于刚new的对象,session和数据库中都不存在,那么该对象时瞬时对象。瞬时对象调用save()方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句。离线对象就是,数据库存在该对象,但是该对象又没有被session所托。
Hibernate持久化对象有三种状态,Transient状态(瞬时状态),Persistent状态(持久化状态)Detached对象(离线状态)。
持久化对象的生命周期:
Transient状态:通过session的save()方法和saveorUpdate()方法可以把一个临时对象和数据相关联,并把临时对象携带的信息通过配置文件所做的映射插入到数据库中,临时对象转化为持久化对象。
Persistent状态:持久化对象总是与Session和Transaction关联在一起,在一个session中,对持久化对象的操作不会立即写到数据库,只有当Transaction(事务)结束时,才真正的对数据库更新,从而完成持久化对象和数据库的同步。在同步之前的持久化对象成为脏对象。当一个session()执行close()、Clear()、或Evict()之后,持久化对象就变为离线对象.
Detached对象:Session关闭之后,与此Session关联的持久化对象就变成为脱管对象,可以继续对这个对象进行修改,如果脱管对象被重新关联到某个新的Session上,会在此转成持久对象。脱管对象虽然拥有用户的标识id,所以通过update()、saveOrUpdate()等方法,再次与持久层关联。
| 是否在session缓存中 | 是否与session实例相关联 | 在数据中是否有与之对应的记录 |
Transient | 否 | 否 | 否 |
Persistent | 是 | 是 | 是 |
Detached | 否 | 否 | 是 |
package com.lf.zym.hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /* * Hibernate的工具类 */ public class HibernateUtils { private static SessionFactory factory; //建立session static{ try { //读取hibernate.cfg.xml文件 Configuration cfg=new Configuration().configure(); //建立SessionFactory factory=cfg.buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } //打开session public static Session getSession(){ return factory.openSession(); } //关闭session public static void closeSession(Session session){ //如果session不等于null if(session !=null) { //如果当前session是打开状态,则关闭session if(session.isOpen()){ session.close(); } } } //返回session工厂类 public static SessionFactory getSessionFactory(){ return factory; } }
package com.bjpowernode.hibernate; import java.util.Date; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import com.lf.zym.hibernate.HibernateUtils; import com.lf.zym.hibernate.User; import junit.framework.TestCase; public class SessionTest extends TestCase { public void testSavel(){ Session session=null; Transaction tx=null; try { session=HibernateUtils.getSession(); tx=session.beginTransaction(); //Transient状态 User user=new User(); user.setName("张三"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); // Persistent状态,Persistent状态的对象,当对象的属性发生改变的时候hibernate在清理缓存(脏数据检查)的时候,会和数据库同步 session.save(user); user.setName("李四"); //提交事务 tx.commit(); } catch (HibernateException e) { e.printStackTrace(); if(tx != null){ //回滚 tx.rollback(); } }finally{ //关闭session,转换为Detached状态 HibernateUtils.closeSession(session); } } }
当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。当应用程序显示调用Session的flush()方法的时候会清除缓存。
简而言之:
对于刚new的对象,session和数据库中都不存在,那么该对象时瞬时对象。瞬时对象调用save()方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句。离线对象就是,数据库存在该对象,但是该对象又没有被session所托。
相关文章推荐
- 说说这些年做的云计算和大数据项目
- Codeforces edu 7 D. Optimal Number Permutation 构造
- 正则表达式之字符的跨度
- Android使用setCustomTitle()方法自定义对话框标题
- Notepad++自动格式化Java代码
- FilterDispatcher已被标注为过时解决办法 >>> FilterDispatcher <<< is deprecated!
- poj 3666 Making the Grade (有序序列,离散化dp)
- Codeforces 611D:New Year and Ancient Prophecy DP 分块记录最后一个
- 在docker上centos7 编译安装php7
- WEB架构师成长之路之一-走正确的路
- 孤儿进程与僵尸进程_笔记
- Python接入天气预报api
- [bzoj3611][Heoi2014]大工程
- 莫队算法(最小曼哈顿生成树或者分块处理)
- 【IOI2001】【poj1195】Mobile phones(二维树状数组)
- 国内 IT 相关网站
- MySQL数据库使用命令小结
- how to open files as sudo
- 运算符的小技巧或容易出错的地方
- windows注册表编程