【hibernate框架12】对象的三种状态Transient-Persistent-Detached

三种状态分别是
Transient(游离状态),Persistent(持久化状态),Detached(脱管状态)。
Teacher t=new Teacher();
t.setName("t12");//游离状态
t.setTitle("中级");//游离状态
t.setBrithday(new Date());//游离状态
t.setZhicheng(ZhiCheng.A);//游离状态



SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();

session.beginTransaction();
session.save(t);//持久化状态
session.getTransaction().commit();


System.out.ptintln(t.getId);//脱管状态


三种状态的区分关键在于:
a)有没有ID(没有ID一定是Transient状态)
b)ID在数据库中有没有
c)在内存中有没有(session缓存)


Transient(游离状态):内存中一个对象,没ID,缓存里没有,数据库中也没有。
Persistent(持久化状态):内存中有,缓存中有,数据库中有(ID)。

Detached(脱管状态):内存有,缓存没有,数据库有,ID。


什么是缓存?
缓存可以提高访问效率,原来的东西放在硬盘上,用东西每次都从硬盘去取,效率很低。这时候可以在内存中保留一份,要用的时候去内存里去取,所以缓存就是内存中的一块区域,里面放着一系列的我们想要提高读取效率的对象或者引用。

 

转载请注明出处:http://blog.csdn.net/acmman/

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013517797/article/details/43341961

 

Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

瞬时态

 

由new命令开辟内存空间的java对象

举例: Person person = new Person("amigo", "女");

        如果没有变量对该对象进行引用,它将被java虚拟机回收。

        瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。

 

持久态

 

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

       当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

       持久对象具有如下特点:

       1. 和session实例关联;

       2. 在数据库中有与之关联的记录。

托管态

 

当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

       脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

       脱管对象具有如下特点:

       1.  本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;

       2.  比瞬时对象多了一个数据库记录标识值。

hibernate中有三种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。

在hibernate中有三种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
通过自己在网上的搜索,也了解到,这三种状态也可以称作:临时状态、持久状态、游离状态。
一、三种状态介绍:
(1) 瞬时状态:
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)。
瞬时状态的特点有:
1、 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录。
2、 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。

举例:
User user=new User();      //user是一个瞬时对象,在数据库的表中是没有记录和该对象相对应的。和session没有关系。
user.setName(“ddd”);
user.setBirthday(new Date());

session.save(user); //持久化状态



(2) 持久状态:
持久(Persistent)是实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。开发者不需要手动执行Update。将对象从持久(Persistent)状态编程瞬时(Transient)状态同样也不需要手动执行delete语句。
持久对象具有如下特点:
1、 和session实例关联;
2、 在数据库中有与之关联的记录。
3、 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录。
举例:
Session session = factory.openSession();    
        Transaction tx = session.beginTransaction();    
   
        session.save(stu); // persistent持久化状态    
        System.out.println(stu);    
   
        tx.commit();    
        session.close();    //执行close()方法之后,就会由持久对象转换成脱管对象
   
        System.out.println(stu); // 脱管对象


(3)脱管状态:
与持久(Persistent)状态对象关联的Session被关闭后,对象就变为脱管(Detached)的。对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上,会再次转变为持久(Transistent)的(在脱管Detached其间的改动将被持久化到数据库)。这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work).
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
1、 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2、 比瞬时对象多了一个数据库记录标识值。
3、 不在于Session相关联。
4、 脱管对象一定是由持久态对象转化而来。

总结:

1、当一个对象被new了以后此对象处于瞬时态(Transient);
2、然后对此对象执行session的save() 或者saveOrUpdate()方法后,此对象被放入session的一级缓存进入持久态.
2、当再对此对象执行evict()/close()/clear()的操作后此对象进入游离态(Detached)
4、游离态(Detached)和瞬时态(Transient)的对象由于没有被session管理会在适当的时机被java的垃圾回收站(garbage)回收.
5、执行session的get()/load()/find()/iternte()等方法从数据库里查询的到的对象,处于持久态(Persistent).  
6、当对数据库中的纪录进行update()/saveOrUpdate()/lock()操作后游离态的对象就过渡到持久态 
7、处于持久态(Persistent)与游离态(Detached)的对象在数据库中都有对应的记录.
8、瞬时态(Transient)与游离态(Detached)的对象都可以被回收可是瞬时态的对象在数据库中没有对应的纪录,而游离态的对象在数据库中有对用的纪录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于证明三维self-avoiding random walk是transient的问题,其实这是一个非常复杂的数学问题,需要用到大量的数学知识和技巧。不过,我们可以简单地了解一下这个问题以及一些相关的概念。 首先,self-avoiding random walk是指在一个普通的随机游走的基础上,排除了走过的路径上出现的重复点,也就是说,每次只能向前走一步,而且不能走回已经走过的点。这个模型可以被用来描述一些物理、化学、生物学以及计算机科学等领域中的现象,比如高分子链的构象以及蛋白质的折叠等。 关于transient这个概念,简单来说,就是指这个随机游走的轨迹最终会离开某个特定的区域,并且不会回到这个区域中。这个区域可以是一个点、一条直线、一个平面,或者更一般地,一个固定的几何形状。相反,如果一个随机游走的轨迹在某一个区域中反复徘徊,那么这个随机游走就是recurrent的。 现在来考虑三维self-avoiding random walk是transient的问题。关于这个问题,已经有一些比较成熟的结论。比如,经典的Hammersley-Welsh定理指出,在三维空间中,self-avoiding random walk是transient的,也就是说,其轨迹最终会离开某个特定的区域,并且不会回到这个区域中。这个定理的证明非常复杂,需要用到很多高度抽象的数学工具,比如Brownian motion、Poisson point processes等等。 总之,证明三维self-avoiding random walk是transient的是一个非常复杂的数学问题,需要用到很多高深的数学技巧和知识。以上只是一个简单的介绍,希望对您有所帮助。如果您对这个问题还有其他的疑问,可以再问我,我会尽力为您解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值