• 【Hibernate】持久化对象状态及以及缓存


    一、持久化类状态

    1.1 三种持久化对象的状态

    • 持久化类:就是一个实体类与数据库表建立了映射
    • Hibernate为了方便管理持久化类,将持久化类分成了三种状态

      • 瞬时态(临时态):transient
      • 持久态:persistent
      • 脱管态(离线态):detached
    • Transient(瞬时态)

    • 特点:持久化对象没有唯一标识OID.没有纳入Session的管理.

    • Persistent(持久态)

    • 特点:持久化对象有唯一标识OID.已经纳入到Session的管理.

    • 结论:持久化持久态对象有自动更新数据库的能力.

    • Detached(脱管态)

    • 特点:持久化对象有唯一标识OID,没有纳入到Session管理

    1.2 区分三种状态

    // 区分持久化对象的三种状态:
        public void demo1(){
            // 1.创建Session
            Session session = HibernateUtils.openSession();
            // 2.开启事务
            Transaction tx = session.beginTransaction();
            
            // 向数据库中保存一本图书:
            Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与session关联.
            book.setName("骆驼祥子");
            book.setAuthor("老舍");
            book.setPrice(65d);
            
            session.save(book); // 持久态:有唯一标识OID,与session关联.
            
            // 3.事务提交
            tx.commit();
            // 4.释放资源
            session.close();
            
            book.setName("钢铁是怎样炼成的"); // 脱管态:有唯一的标识,没有与session关联.
        }
    

    1.3 三种状态对象转换

    1.瞬时态

    • 获取瞬时态:Book book = new Book();//处于瞬时态
    • 瞬时--->持久
      • save(book);
      • save()/saveOrUpdate();
    • 瞬时--->脱管
      • book.setId(1);

    2.持久态

    • 获取持久态:Book book = (Book)session.get(Book.class,1); //处于持久态
      • get()/load()/find()/iterate();
    • 持久--->瞬时
      • delete(book);
      • 特殊状态:删除态.(被删除的对象,不建议去使用.)
    • 持久--->脱管
      • session.close();
      • close()/clear()/evict();

    3.脱管态

    • 获得托管态:Book book = new Book(); book.setId(1);
    • 脱管--->持久
      • session.update();
      • update()/saveOrUpdate()/lock()
    • 脱管--->瞬时
      • book.setId(null);

    4.持久态对象有自动更新数据库的能力

    @Test
        // 测试持久态的对象自动更新数据库
        public void demo2(){
            // 1.创建Session
            Session session = HibernateUtils.openSession();
            // 2.开启事务
            Transaction tx = session.beginTransaction();
            
            // 获得一个持久态的对象.
            Book book = (Book) session.get(Book.class, 1);
            book.setName("Struts2开发");
            
            // session.update(book); 此处没有执行该条语句,也会更新数据库的信息
            
            // 3.提交事务
            tx.commit();
            // 4.关闭资源
            session.close();
        }
        
    
    • 自动更新数据库的能力依赖了Hibernate的一级缓存.
  • 相关阅读:
    经典之计算机内存管理
    Git 远程仓库
    【玩转微信公众平台之十】 图文消息回复解说
    C++11中的继承构造函数
    树莓派使用无线网卡上网相关命令
    swift的UITableView的使用
    相似微信的ChattingUi
    HDOJ 5289 Assignment 单调队列
    poj1936
    samba 文件和目录权限控制
  • 原文地址:https://www.cnblogs.com/haoworld/p/bhibernate-chi-jiu-hua-dui-xiang-zhuang-tai-ji-yi.html
Copyright © 2020-2023  润新知