Hibernate学习之Transient、Persistent、Detached三种状态

本文详细介绍了Hibernate中的三种对象状态:瞬时状态、持久化状态和离线状态,并通过实例演示了如何通过save、update等方法在不同状态间转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看孔浩老师的视频,今天开始学习Hibernate了,Hibernate的三种状态即Transient(瞬时状态)、Persistent(持久化状态)、Detached(离线/托管状态)。
Transient 即对象既不存在与数据库中也没有纳入Hibernate Session的管理中。Persistent 即同时存在与数据库和Hibernate Session的管理中。Detached 即存在于数据库中,而不存在与Hibernate Session的管理中。
对象为Transient时执行save()既是转化为Persistent,对象为Persistent执行delete()后可转化为Transient。清除或关闭Session后则转化为Detached状态,对象为Detached执行update()将回到Persistent。
下面实例具体说明各种情况

//1、
@Test
    public void testTransient() {
        Session session = null;
        try {
            session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            u.setBorn(sdf.parse("1976-2-3"));
            u.setUsername("admin");
            u.setNickname("管理员");
            u.setPassword("123");
            //以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有
            //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态
            session.save(u);

            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            if(session!=null) session.getTransaction().rollback();
        } finally {
            HibernateUtil.close(session);
        }
    }
//2、
session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            u.setBorn(sdf.parse("1976-2-3"));
            u.setUsername("zxq");
            u.setNickname("赵晓七");
            u.setPassword("123");
            //以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有
            //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态
            session.save(u);
            //此时u是持久化状态,已经被session所管理,当在提交时,会把session中的对象和目前的对象进行比较,如果两个对象中的值不一致就会继续发出相应的sql语句
            u.setNickname("赵晓其");
            //此时会发出2条sql,一条用户做插入,一条用来做更新
            session.getTransaction().commit();
//3、
session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            u.setBorn(sdf.parse("1976-2-3"));
            u.setUsername("zxq");
            u.setNickname("赵晓八");
            u.setPassword("123");
            session.save(u);
            u.setPassword("222");
            //该条语句没有意义
            session.save(u);
            u.setNickname("赵晓吧");
            //没有意义
            session.update(u);
            u.setBorn(sdf.parse("1988-12-22"));
            //没有意义
            session.update(u);
            session.getTransaction().commit();
//4、
session = HibernateUtil.openSession();
            session.beginTransaction();
            //此时u是Persistent
            User u = (User)session.load(User.class, 10);
            //由于u这个对象和session中的对象不一致,所以会发出sql完成更新
            u.setUsername("aaa");
            session.getTransaction().commit();
//5、会有update的SQL的语句 
session = HibernateUtil.openSession();
            session.beginTransaction();
            //此时u是Persistent
            User u = (User)session.load(User.class, 10);
            session.getTransaction().commit();
            session.beginTransaction();
            u.setUsername("123");
            session.getTransaction().commit();
//6、清空Session后,u是离线状态不会出现update
session = HibernateUtil.openSession();
            session.beginTransaction();
            //此时u是Persistent
            User u = (User)session.load(User.class, 11);
            u.setUsername("123");
            //清空session
            session.clear();
            session.getTransaction().commit();
//7、
session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            u.setId(10);
            u.setNickname("abc");
            //当执行save的时候总是会添加一条数据,此时id就会根据Hibernate所定义的规则来生成
            session.save(u);
            session.getTransaction().commit();
/**8、抛出异常identifier of an instance of com.norman.model.User was altered from 10 to 333(333的id在数据库中并不存在)*/
session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            u.setId(10);
            //完成update之后也会变成持久化状态
            session.update(u);
            u.setBorn(sdf.parse("1998-12-22"));
            u.setNickname("aaa");
            u.setUsername("111");
            //会抛出异常
            u.setId(333);
            //会发出一条sql
            session.getTransaction().commit();
//9、
session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            u.setId(10);
            //现在u就是transient对象
            session.delete(u);
            //此时u已经是瞬时对象,不会被session和数据库所管理
            u.setNickname("abc");
//10、
session = HibernateUtil.openSession();
            session.beginTransaction();
            User u = new User();
            //u.setId(110);
            u.setNickname("abc");
            //如果u是离线状态就执行update操作,如果是瞬时状态就执行Save操作
            //但是注意:该方法并不常用
            session.saveOrUpdate(u);
            session.getTransaction().commit();
//11、
session = HibernateUtil.openSession();
            session.beginTransaction();
            //u1已经是持久化状态
            User u1 = (User)session.load(User.class, 11);
            System.out.println(u1.getNickname());
            //u2是离线状态
            User u2 = new User();
            u2.setId(11);
            u2.setPassword("12223");
            //此时u2将会变成持久化状态,在session的缓存中就存在了两份同样的对象,在session中不能存在两份拷贝,否则会抛出异常
//          session.saveOrUpdate(u2);
            //merge方法会判断session中是否已经存在同一个对象,如果存在就将两个对象合并
            session.merge(u2);
            //最佳实践:merge一般不用
            session.getTransaction().commit();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值