hibernate对象的三种状态和转换

1.瞬时对象(TransentObjects):由我们自己创建出来,数据库中没有相应的记录,也没有被hibernate的Session管理起来。这样的队对象可以被jvm回收的。

2.持久化对象(persistentObjects):这个对象在数据库中有相应的记录,这个对象被Session管理起来。

3.托管对象(detachObjects):数据库中有相应的记录,但是没有被Session管理。

  • 瞬时对象转换成持久对象

@Test
public void test2() {
    Session session = HibernateUtils.getSssion();
    Transaction transaction = session.beginTransaction();
    // 创建对象,这是是瞬时对象
    try {
        User user = new User();
        user.setUname("张三");
        user.setGender("男");
        user.setBirthday(new Date());
        // 发出sql语句,把user对象纳入到Session的管理,并且保存到数据库,持久状态
        session.save(user);
        // 设置持久对象属性,Session会把修改后的持久对象的属性值和之前
        // 没有修改时的做对比,如果有变化就发出update,如果没有就不发
        user.setUname("风格");
        transaction.commit();
    } catch (Exception e) {
        e.printStackTrace();
        transaction.rollback();
    } finally {
        HibernateUtils.closeSession(session);
    }
}
  • 持久对象转换托管对象
@Test
public void test4() {
    Session session = HibernateUtils.getSssion();
    Transaction transaction = session.beginTransaction();
    // 创建对象,这是是瞬时对象
    User user = new User();
    try {
        user.setUname("张三");
        user.setGender("男");
        user.setBirthday(new Date());
        session.save(user);
        transaction.commit();
    } catch (Exception e) {
        e.printStackTrace();
        transaction.rollback();
    } finally {
        // session关闭,那么user由持久对象变成了托管对象
        HibernateUtils.closeSession(session);
    }

    Session session1 = HibernateUtils.getSssion();
    Transaction transaction1 = session.beginTransaction();
    try {
        user.setUname("尔尔");
        // session1接纳了user,立即把user变成持久对象
        session1.update(user);
        transaction1.commit();
    } catch (Exception e) {
        e.printStackTrace();
        transaction1.rollback();
    } finally {
        HibernateUtils.closeSession(session1);
    }
}

 

  • 通过get和load和iterator查询出来的对象是持久状态
@Test
    public void test5() {
        Session session = HibernateUtils.getSssion();
        Transaction tx = session.beginTransaction();
        try {
            // 通过get方法查询的对象即在Session管理中,也在数据库中也有记录,所以user是持久对象
//            User user = (User) session.get(User.class, 2);
            User user = (User) session.load(User.class, 2);
            System.out.println(user);
            user.setUname("xxx");
            // 发出update语句,证明是持久对象
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            HibernateUtils.closeSession(session);
        }
    }

 

  • 持久和托管转换瞬时

        通过delete把数据库中的数据删除,而且清空Session中的对象,那么这个对象就编程了瞬时对象

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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值