本文目录
- Hibernate对象状态分类的详细说明
- hibernate中transient,persistent,detached对象三者之间有什么区别
- hibernate持久化对象的状态有哪些
- hibernate为什么会有三种状态
- 请解释说明hibernate控制下的pojo对象会呈现三种状态分别是什么,及其含义
- hibernate对象的三种状态是什么
- hibernate持久化对象都有什么状态
- hibernate三种状态各之间是什么意思
- Po的hibernate中po对象的三种状态
Hibernate对象状态分类的详细说明
1.临时状态(transient):刚刚用new语句建立,还没有被持久化,不处于session的缓存中。处于临时状态的java对象称之为临时对象。2.持久化对象(persistent):已经被持久化,加入到session的缓存中。处于持久化状态的java对象被称之为持久化对象,会被session自动同步3.托管(游离)状态(detached):持久化对象关联的session关闭后处于托管状态,可以继续修改然后关联到新的session上,再次成为持久化对象,托管期间的修改会被持久化到DB。这使长时间操作成为可能
hibernate中transient,persistent,detached对象三者之间有什么区别
一、三种状态(Transient、Persistent、Detached)在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的。对于理解hibernate,JVM和sql的关系有更好的理解。对于需要持久化的JAVA对象,在它的生命周期中有三种状态,而且互相转化。1, 临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象; 2, 持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象; 3, 游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象; ×√ 临时状态 (Transient) 持久化状态 (Persistent) 游离状态 (Detached) 是否处于Session缓存中 × √ × 数据库中是否有对应记录 × √ √游离对象和临时对象异同: 两者都不会被Session关联,对象属性和数据库可能不一致; 游离对象有持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;
hibernate持久化对象的状态有哪些
一、综述
hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象)、PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线对象)。
二、Hibernate对象三种状态转化图
三、Hibernate对象三种状态简介及转化条件:
(1)临时状态:
由Java的new命令开辟内存空间的java对象也就是普通的java对象,如果没有变量引用它它将会被JVM收回。简单的说就是程序里面new一个对象,还没有和session关联
(1.1)临时状态——》持久化状态:
临时对象在内存中是孤立存在的,它的意义是携带信息载体,不和数据库中的数据由任何的关联。通过Session的save()方法和saveOrUpdate()方法可以把一个临时对象和数据库相关联,并把临时对象携带的信息通过配置文件所做的映射插入数据库中,这个临时对象就成为持久化对象。
(2)持久化状态:
对象和session有了关联,对象处于hibernate框架管理中.持久化对象在数据库中都有相应的记录,持久化对象可以是刚刚被保存的,也可以是调用get或者load方法刚刚加载的,但都是在相关联的session生命周期中保存这个状态。如果是直接从数据库中查询所返回的数据对象,那这些对象和数据库中的字段相关联,具有相同的id,他们马上变成持久化对象。如果一个临时对象被持久化对象引用,也马上会变为持久化对象。
(2.1)持久化状态——》临时状态
使用delete()方法,持久化对象变为临时对象,并且删除数据库中相应的记录,这个对象不再与数据库有任何的联系。
(2.2)持久化状态——》离线对象
当一个session()执行close()、clear()、或evict()之后,持久化对象就变为离线对象,这时对象的id虽然拥有数据库的识别值,但已经不在Hibernate持久层的管理下,他和临时对象基本上一样的,只不过比临时对象多了数据库标识id。没有任何变量引用时,jvm将对其进行回收。
持久化对象总是与Session和事务(Transaction)关联在一起,在一个session中,对持久化对象的操作不会立即写到数据库,只有当Transaction(事务)结束时也就是提交事务执行commit方法的时候,才真正的对数据库更新,从而完成持久化对象和数据库的同步。在同步之前的持久化对象成为脏对象。
(3)托管对象(离线状态):
在持久态的情况下,对象和session失去了关联,比如session.close()或session.evite(obj) 后,即游离态,但数据已经存储到了数据库。Session关闭之后,与此Session关联的持久化对象就变成为脱管对象,可以继续对这个对象进行修改,如果脱管对象被重新关联到某个新的Session上,会在此转成持久对象。脱管对象虽然拥有用户的标识id,所以通过update()、saveOrUpdate()等方法,再次与持久层关联。
(3.2)离线状态——》临时状态
执行Delete方法。
四、代码演示:
[java] view plain copy print?
public class SessionTest extends TestCase {
public void testSave1()
{
Session session = null;
Transaction tx = null;
try
{
session = HibernateUtils.getSession();//取得session.
tx = session.beginTransaction();//开启事务. 返回 transient的一个实例.
User user = new User();//这里通过new一个User类型的对象,产生一个Transient(临时)状态的对象.
user.setName(“张三“);
user.setPassword(“123“);
user.setCreateTime(new Date());
//缓存的时候(脏数据检查)的时候,会和数据库同步.
session.save(user);//进行保存.执行save则对session进行管理,对象变为持久化状态.发出insert语句,自动生成user表的标识id值
user.setName(“李四“);//持久化(persistent)状态的对象.会发出update语句,当对象的属性发生改变的时候,hibernate在清理
tx.commit();//进行提交,关闭事务.
}catch(Exception e)
{
e.printStackTrace();
if(tx!=null)
{
// 事务回滚.
tx.rollback();
}
}finally
{
HibernateUtils.closeSession(session);//关闭session.当关闭session后处于Detached(离线)状态.
} //这时候,就不能再用以前的session了再想将此对象变为持久化对象需要重新得到新的session,开启事务,将此对象纳入session管理
}
日志记录:
[sql] view plain copy print?
Hibernate: insert into User (name,password,createTime) values (?,?,?,?)
Hibernate: update User set name=?,password=?,createTime=? where id=?
hibernate为什么会有三种状态
对于hibernate,它的对象有三种状态,transient、persistent、detached 1.transient:瞬态或者自由态 (new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient) 2.persistent:持久化状态
请解释说明hibernate控制下的pojo对象会呈现三种状态分别是什么,及其含义
对于hibernate,它的对象有三种状态,transient、persistent、detached 1.transient:瞬态或者自由态 (new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient) 2.persistent:持久化状态 (和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent) 3.detached:脱管状态或者游离态 (1)当通过get 或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于 detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态 (2)当把session关闭时,session缓存中的persistent的po对象也变成detached 因关闭session而变成游离态的可以通过lock、save、update变成持久态 持久态实例可以通过调用 delete()变成脱管状态。 通过get()或load()方法得到的实例都是持久化状态的。 脱管状态的实例可以通过调用lock()或者replicate()进行持久化。 save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE, 而update()或merge()会引发SQL UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE。 saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE
hibernate对象的三种状态是什么
(1)瞬态:表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联即,该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有: 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。(2)持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对象的实例相关的。处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate持久化到数据库中。处于持久态的对象具有的特征为: 每个持久态对象都于一个Session对象关联 处于持久态的对象是于数据库中的记录相关联的 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录(3)游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。。游离态对象的特征有: 游离态对象一定是由持久态对象转换而来 游离态实体不再于Session关联 游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据 游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
hibernate持久化对象都有什么状态
在Hibernate中,对象有三种状态:临时状态(Transient)、持久状态(Persistent)和游离状态(Detached)。处于持久态的对象也称为PO(PersistenceObject),临时对象和游离对象也称为VO(ValueObject).1. 临时状态由new命令开辟内存空间的java对象,例如:User user=new User();临时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系.(a)如果没有变量对该对象进行引用,它将被gc回收;(b)在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该临时对象转变成持久化对象.2. 持久状态处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.通过session的get()、load()等方法获得的对象都是持久对象。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的(Dirty)。(a)如果是用hibernate的delete()方法,对应的持久对象就变成临时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联.(b)当一个session执行close()或clear()、evict()之后,持久对象变成游离对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下.持久对象具有如下特点:(1)和session实例关联;(2)在数据库中有与之关联的记录,并拥有持久化标识.3. 游离状态当与某持久对象关联的session被关闭后,该持久对象转变为游离对象.当游离对象被重新关联到session上时,又再次转变成持久对象(在Detached其间的改动将被持久化到数据库中)。游离对象拥有数据库的识别值,但已不在持久化管理范围之内。(a)通过update()、saveOrUpdate()等方法,游离对象可转变成持久对象.(b)如果是用hibernate的delete()方法,对应的游离对象就变成临时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联.(c)在没有任何变量引用它时,它将被gc在适当的时候回收;游离对象具有如下特点:(1)本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;(2)比瞬时对象多了一个数据库记录标识值.示例:Session session=factory.openSession();User user=new User(); //user对象处于临时状态。user.setName(“张三“);user.setAge(18);Transaction tran=Session.beginTransaction();session.save(user);//user对象转化为持久状态。tran.commit(); session.close();//user对象转化为游离状态。user.setName(“李四“); Session session2=factory.openSession();Transaction tran2=Session2.beginTransaction();Session2.update(user);//user对象转化为持久状态。tran2.commit();(游离状态中对象的变动在再次持久时会被持久化到数据库) Transaction tran3=Session.beginTransaction();Session2.delete(user);//user对象转化为临时状态。tran3.commit();session2.close();Session的不同操作对对象状态的影响:Session的save()方法save()方法将一个临时对象转变为持久对象。Session的update()方法update()方法将一个游离对象转变为持久对象。Session的lock()方法调用lock()方法将对象同Session相关联而不强制更新。Session的merge()方法拷贝指定对象的状态到具有相同对象标识符的持久对象。Session的saveOrUpdate()方法saveOrUpdate()方法对于临时对象,执行save()方法,对于游离对象,执行update()方法。Session的load()和get()方法load()方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。Session的delete()方法delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条delete语句。如果传入的参数是游离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。Session的evict()方法evict()方法从Session的缓存中删除一个持久对象。
hibernate三种状态各之间是什么意思
对于和ibernate而言,对象有三种状态:瞬时对象,持久对象,游离对象或脱管对象 1.瞬时(transient):数据库中没有数据与之对应,超过作用域会被jvm的垃圾收集器回收,一般是new出来且与session没有关联的对象 2.持久(persistent):数据库中有数据与之对应,当前session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到 )。 3,脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,hibernate不能检测到。
Po的hibernate中po对象的三种状态
在Hibernate中,最核心的概念就是对PO的状态管理。一个PO有三种状态:1.transient:瞬态或者自由态未被持久化的VO,此时就是一个内存对象VO,由JVM管理生命周期。2.persistent:持久化状态已被持久化的PO,并且在Session生命周期内,此时映射数据库连接,由数据库管理生命周期。3.detached:脱管状态或者游离状态曾被持久化过,但现在和Session已经托管(detached)了,以VO的身份在运行。它还可以进入另一个Session,继续PO状态管理。 当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于detached,(表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态。 当把session关闭时,session缓存中的persistent的po对象也变成detached因关闭session而变成游离态的可以通过lock、save、update变成持久态持久态实例可以通过调用delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。 脱管状态的实例可以通过调用lock()或者replicate()进行持久化 。