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