Hibernate学习笔记—Hibernate对象的三种状态

来源:互联网 发布:nginx 参数 编辑:程序博客网 时间:2024/06/05 07:09

一、Hibernate对象的三种状态

  • 瞬时对象(transientObjects):由我们自己创建出来,数据库中没有相应的记录,也没有被hibernate的Session管理起来,这样的对象可以被jvm回收的
  • 持久化对象(persistentObjects):这个对象在数据库中有相应的记录,这个对象被Sessioon管理起来
  • 脱管对象(detachObjects):数据库中有相应的记录,但是没有被Session管理

二、Hibernate对象的三种状态的相互转换

这里写图片描述

(一)瞬时对象转换为持久化对象

public class TestHibernate {    @Test    public void test1(){        Session session =HibernateUtils.getSession();        Transaction tx=session.beginTransaction();        try {            //创建对象,这时是瞬时对象            User user=new User();            user.setUname("张三");            user.setGender(1);            user.setBirthday(new Date());            //发出sql语句,把user对象纳入到session的管理,并且保存到数据库中,这时候是持久状态            session.save(user);            //设置持久对象的属性,Session会把修改后的持久对象的属性值和没有修改时的做对比,如果有变化就发出update,没有就不发            //最终数据库里面是先插入“张三”这一条记录,然后再update为“李四”            user.setUname("李四");            tx.commit();        } catch (Exception e) {            e.printStackTrace();            tx.rollback();        }finally{            HibernateUtils.closeResource(session);        }    }}
  • 上例中调用session的save()方法,把瞬时对象转换为了持久化对象
  • 对持久化对象的修改,如上例的user.setUname(“李四”),最终会影响数据库里面的记录

(二)持久化对象和脱管对象的相互转换

public class TestHibernate {    @Test    public void test() {        Session session = HibernateUtils.getSession();        Transaction tx = session.beginTransaction();        User user = new User();        try {            user.setUname("老王");            user.setGender(1);            user.setBirthday(new Date());            session.save(user);            tx.commit();        } catch (Exception e) {            e.printStackTrace();            tx.rollback();        } finally {            // Session关闭,那么user由持久化对象变成脱管对象            HibernateUtils.closeSession(session);        }        Session session1 = HibernateUtils.getSession();        Transaction tx1 = session1.beginTransaction();        try {            user.setUname("老李");            // Session1接纳了user,立即把user从脱管对象转换成持久化对象            session1.update(user);            tx1.commit();        } catch (Exception e) {            e.printStackTrace();            tx1.rollback();        } finally {            HibernateUtils.closeSession(session1);        }    }}

(三)通过get和load和iterator查询出来的对象是持久对象

public class TestHibernate {    @Test    public void test() {        Session session = HibernateUtils.getSession();        Transaction tx = session.beginTransaction();        try {            // 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象            User user = (User) session.get(User.class, 1);            System.out.println(user);            user.setUname("lili");            // 发出update语句,证明是持久对象            tx.commit();        } catch (Exception e) {            e.printStackTrace();            tx.rollback();        } finally {            HibernateUtils.closeSession(session);        }    }}

(四)持久和脱管对象转瞬时

public class TestHibernate {    @Test    public void test() {        Session session = HibernateUtils.getSession();        Transaction tx = session.beginTransaction();        try {            // 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象            User user = (User) session.get(User.class, 1);            System.out.println(user);            // session的删除会把数据库中的记录删掉,同时清掉session的user对象            session.delete(user);            tx.commit();        } catch (Exception e) {            e.printStackTrace();            tx.rollback();        } finally {            HibernateUtils.closeSession(session);        }    }}

上例中通过delete把数据库中的数据删除,而且清掉Session中的对象,那么这个对象就变成瞬时对象

原创粉丝点击