2.hibernate对象生命周期

2.hibernate对象生命周期_第1张图片
hibernate对象生命周期.png

hibernate的实体对象分为三种状态:

  1. 瞬时状态Transient:不纳入session管理,数据库中没有对应记录
  2. 持久状态Persistent:纳入session管理,数据库中有对应记录
  3. 游离状态Detached:不纳入session管理,数据库中有对应记录

下面根据上图的各种状态转移展示一下代码:

瞬时->持久->游离->持久

/**
 * 测试对象三种状态,解释什么操作下状态进行转换
 * 
 * 瞬时状态Transient Objects 持久化状态Persistent Objects 离线状态Detached Objects
 */
public void test2() {
    Session session = null;
    User user1 = null, user2 = null;
    try {
        session = hibernateUtil.getSession();
        session.beginTransaction();

        // 现在是Transient状态,还没有纳入session管理,数据库中也没有对应的数据
        user1 = new User();
        user1.setUserName("张三");
        user1.setPassWd("1234567");

        user2 = new User();
        user2.setUserName("李四");
        user2.setPassWd("1234567");

        // 当save保存后,对象变为Persistent状态,纳入session管理,并且在数据库中有对应的记录
        session.save(user1);
        session.save(user2);

        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        // 当session关闭后,对象转换为Detached状态
        hibernateUtil.closeSession(session);
    }

    // 这里开始第二个session
    try {
        session = hibernateUtil.getSession();
        session.beginTransaction();
        // 这里是Detached状态,session中没有管理,但是数据库中有对应记录
        user1.setUserName("赵五");

        // 显示的调用update,调用完毕之后,user1对象又变成Persistent状态
        session.update(user1);

        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        hibernateUtil.closeSession(session);
    }
}
2.hibernate对象生命周期_第2张图片
4.png

load读取出来的对象,直接就是Persistent状态

/**
 * 测试读取,读取出来的数据是persistent状态 load方法
 */
public void test3() {
    Session session = null;
    User user = null;

    try {
        session = hibernateUtil.getSession();
        session.beginTransaction();
        // 这里读取出来一个persistent状态的实体对象
        user = (User) session.load(User.class, 1);
        System.out.println("用户名:" + user.getUserName());

        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        hibernateUtil.closeSession(session);
    }
}

load函数是cglib代理方式,延迟加载,在函数调用的时候返回的是代理类型,不是实体类型,target是存储真实数据的地方,刚开始是空的

2.hibernate对象生命周期_第3张图片
5.png

这是延迟加载,在实际使用的时候取回的数据保存位置

2.hibernate对象生命周期_第4张图片
6.png

Persistent状态转换为Transient状态

/**
 * 测试一下delete方法,看看执行删除操作后,对象状态
 */
public void test4() {
    Session session = null;
    User user = null;

    try {
        session = hibernateUtil.getSession();
        session.beginTransaction();
        // 这里读取出来一个persistent状态的实体对象
        user = (User) session.load(User.class, 1);
        System.out.println("用户名:" + user.getUserName());

        // 这里删除数据库中的记录
        session.delete(user);

        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        hibernateUtil.closeSession(session);
    }

    System.out.println("用户名称:" + user.getId());

}

从库里查出来,然后删除,事务提交,这个对象还是存在的,而且ID也是存在的,虽然库里面已经没有了


这里有几点需要注意的问题:

  1. update测试的时候需要来回的调整数据的覆盖方式
  2. 。。。

你可能感兴趣的:(2.hibernate对象生命周期)