Hibernate中关于持久化类的三种状态

来源:互联网 发布:手机淘宝昵称怎么修改 编辑:程序博客网 时间:2024/06/06 11:04

关于持久化类的三种状态

package com.hibernate.demo1;import java.util.List;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.criterion.Restrictions;import org.junit.Test;import com.hibernate.utils.HibernateUtils;/*** * hibernate入门案例中的API详解 * @author Administrator * */public class HibernateTest2 {    @Test    /****     * 群持久化对象的三种状态     */    public void demo1(){        //1通过工具类获取Session        Session session = HibernateUtils.openSession();        //2开启事务        Transaction tx = session.beginTransaction();        //3操作        //向数据库插入一条记录            Book book = new Book();    // 瞬时态:没有位移标识OID(主键id),没有与session关联                                       //                |                                       //                |            book.setName("盗墓笔记");    //              |            book.setAuthor("南派三叔"); //               |            book.setPrice(100d);       //                |                                       //               \|/            session.save(book);        // 持久太:有唯一标识OID,与session关联        //4事务提交                    //                |        tx.commit();                   //                |        //5释放资源                    //                |        session.close();               //                |                                       //               \|/        book.setName("XXX");           // 托管态:有唯一标识OID,没有与session关联    }    @Test    /****     * 演示持久太的对象可以以自动更新数据库     */    public void demo2(){        //1通过工具类获取Session        Session session = HibernateUtils.openSession();        //2开启事务        Transaction tx = session.beginTransaction();        //3操作            /** 获取一个持久太对象了 **/            Book book = (Book) session.get(Book.class, 1);            book.setName("精绝古城");            /** 此处可以省略一个update **/        //4事务提交        tx.commit();        /**=================一级缓存【与session的生命周期一致,自带的,不可卸载】================================          * 提交后,执行了一个update,         * 依赖于hibernate一级缓存【就是将数据库/硬盘文件中数据,放到缓存中(就是内存中一块空间),         * 当再次使用时,可以直接从内存中获取数据信息】 **/        //5释放资源        session.close();    }    @Test    /****     * 证明一级缓存的存在     */    public void demo3(){        //1通过工具类获取Session        Session session = HibernateUtils.openSession();        //2开启事务        Transaction tx = session.beginTransaction();        //3操作            /** save方法可以向一级缓存中存放数据  **///              Book book = new Book();//              book.setName("盗墓笔记");     //              book.setAuthor("南派四叔");//              book.setPrice(120d);            /** save执行后会有一个返回值(图书id) **///              Integer id = (Integer) session.save(book);            /** 根据该id值查询这个Book的信息 **///              Book book2 = (Book) session.get(Book.class, id);//              System.out.println(book2);            /** =======上述方式不太明显,以下分别用两次get执行两次查询id=1的书【按道理执行两次get应发送两条sql语句,实际上只发送一次,足以证明第二次查询使用的是一级缓存中的数据】================== **/                /** 数据库中第一本书的信息**/                    Book book3 = (Book) session.get(Book.class, 1);                    System.out.println(book3);                /** 一级缓存中中第一本书的信息**/                        Book book4 = (Book) session.get(Book.class, 1);                    System.out.println(book4);                    //4事务提交        tx.commit();        //5释放资源        session.close();    }    @Test    /****     * 深入了解持久态的对象可以以自动更新数据库     * 基于一级缓存:快照区     */    public void demo4(){        //1通过工具类获取Session        Session session = HibernateUtils.openSession();        //2开启事务        Transaction tx = session.beginTransaction();        //3操作            Book book = (Book) session.get(Book.class, 1);            /** 将信息存储于快照区 **/            book.setName("天龙八部");//先向一级缓存区的【name】修改为【"天龙八部"】-----中间会进行一个比对查看是否一致,如果一致不更新(不会执行update语句),如果不一致----再向快照区中的【name】修改为【"天龙八部"】(执行update语句)。        //4事务提交        tx.commit();        //5释放资源        session.close();    }}
0 0
原创粉丝点击