004——session的持久化生命周期
来源:互联网 发布:如何联系淘宝达人 编辑:程序博客网 时间:2024/05/20 22:32
Transient:
- 没有被session管理
- 在数据库中没有与之匹配的记录
Persistent:
- 纳入session管理
- 在数据库中有与之匹配的记录
- 当属性发生改变,在清理缓存时(脏数据检查)会自动和数据库同步
Detached:
- 没有被session管理
- 在数据库中没有与之匹配的记录
Hibernate的工具类HibernateUtils.java
package com.java.hibernate;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory factory;static {try {//Configuration cfg = new Configuration()读取的是hibernate.properties配置文件//读取hibernate.cfg.xml配置文件Configuration cfg = new Configuration().configure();//建立SessionFactoryfactory = cfg.buildSessionFactory();} catch (Exception e) {e.printStackTrace();}}/** * 获得 * @return */public static Session getSession() {return factory.openSession();}/** * 关闭session * @param session */public static void closeSession(Session session) {if(session != null) {if(session.isOpen()) {session.close();}}}/** * 得到SessionFactory对象 * @return */public static SessionFactory getSessionFactory() {return factory;}}
事例SessionTest.java
package com.java.hibernate;import junit.framework.TestCase;import org.hibernate.Session;import org.hibernate.Transaction;public class SessionTest extends TestCase {public void testSave1() {Session session = null;Transaction tx = null;try {session = HibernateUtils.getSession();tx = session.beginTransaction();//Transient状态User user = new User();user.setUsername("李四");user.setPassword("123465");user.setEmail("lisi@163.ccom");user.setPhone("18814182323");//Persistent状态//Persistent状态的对象,当对象的属性发生改变的时候//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步session.save(user);user.setUsername("张三");tx.commit();} catch (Exception e) {e.printStackTrace();if(tx != null) {tx.rollback();}} finally {HibernateUtils.closeSession(session);}//detached状态}public void testSave2() {Session session = null;Transaction tx = null;try {session = HibernateUtils.getSession();tx = session.beginTransaction();//Transient状态User user = new User();user.setUsername("李四");user.setPassword("132456");user.setEmail("liSi@163.com");user.setPhone("18814181111");//Persistent状态//Persistent状态的对象,当对象的属性发生改变的时候//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步session.save(user);user.setUsername("王五");//可以显示的调用update方法,因为此时为持久状态,调用update没有什么意义session.update(user);tx.commit();//提交后打印Hibernate: insert into User (username, password, email, phone, id) values (?, ?, ?, ?, ?)//Hibernate: update User set username=?, password=?, email=?, phone=? where id=?} catch (Exception e) {e.printStackTrace();if(tx != null) {tx.rollback();}} finally {HibernateUtils.closeSession(session);}//detached状态}public void testSave3() {Session session = null;Transaction tx = null;User user = null;try {session = HibernateUtils.getSession();tx = session.beginTransaction();//Transient状态user = new User();user.setUsername("王五");user.setPassword("123");user.setEmail("wangwu@163.com");user.setPhone("18814182222");//Persistent状态//Persistent状态的对象,当对象的属性发生改变的时候//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步session.save(user);user.setUsername("李四");tx.commit();} catch (Exception e) {e.printStackTrace();if(tx != null) {tx.rollback();}} finally {HibernateUtils.closeSession(session);}//detached状态user.setUsername("张");try {session = HibernateUtils.getSession();tx = session.beginTransaction();//将detached状态的对象重新纳入session管理//此时将变为persistent状态的对象//persistent状态的对象,在清理缓存是会和数据库同步session.update(user);tx.commit();} catch (Exception e) {e.printStackTrace();if(tx != null) {tx.rollback();}} finally {HibernateUtils.closeSession(session);}}public void testGet1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//get加载上来的对象为持久对象//执行get会马上发出查询语句User user = (User) session.get(User.class, "40287e8155f2e2310155f2e231920001");//Persistent状态//Persistent状态的对象,当对象的属性发生改变的时候//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步user.setUsername("李四");session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {HibernateUtils.closeSession(session);}}public void testGet2() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//get方法加载数据,如果不存在返回nullUser user = (User) session.get(User.class, "123465789456312");System.out.println(user.getUsername());session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {HibernateUtils.closeSession(session);}}public void testLoad1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载)//什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说//才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性//hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的//而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类//生成代理,它采用的是继承方式User user = (User)session.load(User.class, "40287e8155f2e2310155f2e231920001");System.out.println(user.getUsername());user.setUsername("王五");session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}public void testLoad2() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//采用load查询不存在的数据,hibernate会抛出ObjectNotFoundException异常User user = (User)session.load(User.class, "555554");System.out.println(user.getUsername());session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}public void tesDelete1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();User user = (User)session.load(User.class, "40287e8155f2e2310155f2e231920001");//删除,建议采用此种方式删除:先加载再删除session.delete(user);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}public void tesDelete2() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//手动构造Detached对象User user = new User();user.setId("40287e8155f2e2dc0155f2e2dca80001");session.delete(user);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}public void tesUpdate1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//手动构造Detached对象User user = new User();user.setId("40287e8155f2f2180155f2f2195d0001");user.setUsername("周六");session.update(user);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}public void tesUpdate2() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//建议采用此种方式更新,先加载再更新User user = (User)session.load(User.class, "40287e8155f2f2180155f2f2195d0001");user.setUsername("周");//可以显示的updatesession.update(user);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}}
持久化状态图:
0 0
- 004——session的持久化生命周期
- Session缓存和持久化生命周期
- Hibernate持久化生命周期——三态
- 4.1 持久化生命周期
- hibernate持久化生命周期
- hibernate持久化生命周期
- hibernate的三种持久化生命周期
- Session 缓存和持久化生命周期以及Session 基本操作3
- hibernate之持久化生命周期
- Hibernate 实体持久化生命周期状态
- 关于组件实例化生命周期
- Flex 组件实例化生命周期
- 浅谈——session周期
- Session和request的声命周期
- session 的周期处理
- session的生存周期
- Flex Component instantiation life cycle | Flex组件实例化生命周期
- SESSION变量的生存周期
- 在mac上安装scikit-learn
- javaScript--05 DOM基础 12.8
- [HTML] 图片标签、绝对路径 和 相对路径
- 利用SharePoint 2013 创建Service Desk 网站之一线工程师处理问题界面!
- 51Nod 1006 最长公共子序列LCS DP水题
- 004——session的持久化生命周期
- SQL 模糊查询 和 escape
- seaJs
- 变形的杨辉三角形--华为
- Cloudera 5.7集群部署(二)--CM、CDH安装
- C#反射
- ffmpeg常用命令记录
- 位操作训练
- poj 1061(扩展欧几里得算法)