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

关于持久化类的三种状态

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();
    }
}

你可能感兴趣的:(hibernate)