zoukankan      html  css  js  c++  java
  • 【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的一级缓存.
  • 相关阅读:
    go案例:客户管理系统流程 mvc模式 分层设计
    珠峰2016,第9期 vue.js 笔记部份
    前后端分离电商,业务逻辑部份
    'Specifying a namespace in include() without providing an app_name '报错解决
    vue2.0 前端框架
    vue项目实战
    电商网前后端分离数据表设计部份
    djang2.1教育平台02
    django框架开发流程
    测试的艺术:测试用例的设计
  • 原文地址:https://www.cnblogs.com/haoworld/p/bhibernate-chi-jiu-hua-dui-xiang-zhuang-tai-ji-yi.html
Copyright © 2011-2022 走看看