day35 02-Hibernate持久化对象状态及状态转换


hibernate内置有一个c3p0,不用引入c3p0的jar包也行。


现在其实可以不用去创建表和实体类。因为hibernate可以自动帮我们生成。只要把映射建好了它就可以自动帮我们生成。


创建实体类和对应的映射。


一运行java项目hibernate3_day02的工具类/hibernate3_day02/src/cn/itcast/utils/HibernateUtils.java就可以生成表。前提是先建立数据库hibernate3_day02。必须得有数据库才行。





package cn.itcast.hibernate3.demo1;

import static org.junit.Assert.*;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.utils.HibernateUtils;

/**
 * Hibernate的测试类
 * 
 * @author zhongzh
 *
 */



public class HIbernateTest1 {

    @Test
    //区分持久化对象的三种状态:
    public void demo1() {
        //  1.创建Session
        Session session = HibernateUtils.openSession();
        //  2.开启事务
        Transaction tx = session.beginTransaction();
        
        //往数据库去保存一本图书:
        Book book = new Book();//book是一个持久化对象,因为book有一个实体类已经
        //和我们的表建立起映射了 Book是一个持久化类  一new()就是瞬时态了  
        //瞬时态: 没有唯一标识OID,没有与session关联.
        //刚new()出来,从数据库里面也不知道它是什么。它根本就没有OID,没有和session关联,是一个单独的
        //对象
        book.setName("Hibernate开发");
        book.setAuthor("孙XX");
        book.setPrice(65d);
        
        session.save(book);  //持久态  往数据库一存它就有OID了,而且是和session关联。
        //持久态: 有唯一标识OID,与session关联.
        
        //  3.事务提交
        tx.commit();
        //4.释放资源
        session.close();
        
        book.setName("Struts2开发");  //脱管态  session关闭了,book不与session关联了。
        //脱管态:有唯一的标识,没有与session关联.
        fail("Not yet implemented");
    }

}

find()不用记,是JPA提供的接口中的一个方法。那么hibernate肯定得有它的一个实现。get()、load()、find()、iterate()都是做查询的。

虽然这个状态图是官方给出来的,但是并不是十分的标准。有很多人认为,delete(book)之后也不是瞬时态的。delete(book)之后这个对象不是马上销毁的,只不过对应的数据库中的记录没有了。还有人认为,没有OID了,但是它还没有解除与session的关系。

官方给出的状态图不建议你直接获取脱管态对象。

原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6673294.html