zoukankan      html  css  js  c++  java
  • Hibernate之持久化对象

    时间:2017-1-19 23:00

    ——Hibernate持久化类的状态

    1、持久化类:就是一个实体类与数据库建立了映射。

    2、Hibernate为了方便管理持久化类,将持久化类分为了三种状态:
        1)瞬时态:transient(临时态)
        2)持久态:persistent
        3)脱管态:detached(离线态)


    ——三种持久化对象的状态

    1、三种持久化对象的状态
        1)瞬时态
            不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收。
            无持久化标识OID,未与Session关联。

        2)持久态
            存在持久化标识OID,与当前Session有关联,并且关联的Session没有关闭,事务未提交。
            存在持久化标识OID,与Session关联。

            持久化对象有自动更新数据库的能力。

        3)脱管态
            存在持久化OID,但没有与当前Session关联,脱管状态改变时Hibernate无法检测。
            存在持久化标识OID,未与Session关联。

    2、区分三种持久化对象的状态

    示例代码:

    public class HibernateDemo1 {
        @Test
        /*
         * 区分持久化对象的三种状态:
         */
        public void fun1(){
            // 1、创建Session
            Session session = HibernateUtils.openSession();
            // 2、开启事务
            Transaction tx = session.beginTransaction();
     
            /*
             * 3、逻辑操作
             */
     
            // 向数据库中保存一本图书
            Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与Session关联
     
            book.setName("Hibernate");
            book.setAuthor("张三");
            book.setPrice(50D);
     
            session.save(book); // book变为一个持久态对象,有唯一标识OID,与Session关联
     
     
            // 4、提交事务
            tx.commit();
            // 5、施放资源
            session.close();
     
            book.setName("Struts2"); // 此时book就是脱管态了,有唯一标识OID,但与Session无关联
        }
    }


    3、三种状态对象的转换

    瞬时态:
        Book book = new Book();
        1)瞬时态 ——> 持久态
            Book book = new Book();
            session.save(book);

        2)瞬时态 ——> 脱管态
            book.setId(1); // 设置OID

    持久态:
        Book book = (Book)session.get(Book.class, 1);
        get() / load() / find()  iterate()

        1)持久态 ——> 瞬时态
            session.delete(book); // 删掉之后就没有OID了

        2)持久态 ——> 脱管态
            session.close()
            clear() / evict(book) 将Session中的指定对象删除。

    脱管态:
        Book book = new Book();
        book.setId(1);

        1)脱管 ——> 持久
            session.update(book);

        2)脱管 ——> 瞬时
            book.setId(null);

    ——持久态对象自动更新数据库

    示例代码:

        /*
         * 持久态对象自动更新数据库
         */
        public void fun2(){
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
     
            // 获得一个持久态对象
            Book book = (Book)session.load(Book.class, 1);
     
            book.setName("Struts2");
     
            tx.commit(); // 当提交时会发送一条update语句,自动更新数据库数据,依赖的是Hibernate的一级缓存
            session.close();
        }


    ——总结

    1、Hibernate持久化对象的状态:
        *   瞬时态
            没有唯一标识OID,没有与Session关联
        *   持久态
            有唯一标识OID,与Session关联
        *   脱管态
            有唯一标识OID,没有与Session关联

    2、瞬时态对象
        User user = new User()
        瞬时态-->持久态
            session.save(user)
        瞬时态-->脱管态
            user.setId(1)

    3、持久态对象
        get() / load()
        持久态-->瞬时态
            session.delete(Object)
        持久态-->脱管态
            session.close() / session.clear() / session.evice()

    4、脱管态
        User user = new User();
        user.setId(1)
        脱管态-->瞬时态
            user.setId(null)
        脱管态-->持久态
            save() / saveOrUpdate()

  • 相关阅读:
    【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
    【转】性能调优从哪里入手
    【转】从来没有冲突的团队是最糟糕的团队
    【转】华为Java编程军规,每季度代码验收标准
    【转】性能测试随笔,看看罢了,只做笑谈尔。
    MVC的JsonResult用法
    artDialog
    js apply/call/caller/callee/bind使用方法与区别分析
    jquery的each()详细介绍
    ASP.NET 4.5.256 has not been registered on the Web server
  • 原文地址:https://www.cnblogs.com/wwwwyc/p/6375454.html
Copyright © 2011-2022 走看看