百度
360搜索
搜狗搜索

hibernate的三种状态,hibernate对象的三种状态是什么?详细介绍

本文目录一览: 请解释说明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
二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
三、update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate
reference中的一段话来解释他们的使用场合和区别
通常下面的场景会使用update()或saveOrUpdate():
程序在第一个session中加载对象,接着把session关闭
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层最终到持久层
程序创建第二session调用第二个session的update()方法持久这些改动
saveOrUpdate(po)做下面的事:
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事
如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常
org.hibernate.NonUniqueObjectException:
a different object with the same
identifier value was already associated with the session:
[org.itfuture.www.po.Xtyhb#5]
saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update()
这个对象
四、persist和save区别
这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate
reference文档中也没有明确的区分他们.
这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
主要内容区别:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
2,save,
把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert
五、saveOrUpdate,merge和update区别
比较update和merge
update的作用上边说了,这里说一下merge的
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例
(1)当我们使用update的时候,执行完成后,会抛出异常
(2)但当我们使用merge的时候,把处理自由态的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态还是持久态,而我们提供的A还是自由态
六、flush和update区别
这两个的区别好理解
update操作的是在自由态或脱管状态(因session的关闭而处于脱管状态)的对象//updateSQL
而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象的改动(包含set容器)是不需要update的,只要你更改了对象的值,等待hibernate
flush就自动更新或保存到数据库了。hibernate
flush发生在以下几种情况中:
1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合
get()一个对象,把对象的属性进行改变,把资源关闭。
2,transaction
commit的时候(包含了flush)
七、lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象)
对应更改一个记录的内容,两个的操作不同:
update的操作步骤是:
(1)属性改动后的脱管的对象的修改->调用update
lock的操作步骤是:
(2)调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
八、clear和evcit的区别
clear完整的清除session缓存

evcit(obj)把某个持久化对象从session的缓存中清空。
转自:http://silmon.javaeye.com/blog/218807

hibernate对象的三种状态是什么?

临时状态(新建状态):刚用new语句创建,还没被实例化,并且不处于session的缓存中,处于临时状态的java对象被称为临时对象.
持久化状态:被加入到数据库中,也被加入到session缓存中,处于持久化的java对象被称为持久化对象.
游离状态:已经被持久化,但是不存在session缓存中,处于游离的java对象被称为游离对象.
删除状态:不处于数据库,更不处于session缓存中.
有三个状态:瞬时、持久、托管
其中用set为瞬时态,save后为持久态,当session关闭后变为游离态
瞬时态,持久态,脱管态
(1)瞬态:表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联即,该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有:
?????????????? 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录?与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。
(2)持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对象的实例相关的。处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate持久化到数据库中。处于持久态的对象具有的特征为: ?????????????
? 每个持久态对象都于一个Session对象关联
?????????????? 处于持久态的对象是于数据库中的记录相关联的
?????????????? Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录
(3)游离态:处于持久态的实体对象,当他不再与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=?

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()进行持久化 。

java框架hibernate的实体对象有哪三种状态?以及这三种状态下,对实体进行修改会不会同步到数据库里?

1. 瞬时状态: 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态。自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。

2. 持久状态: 持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。

3. 脱管状态:当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中 可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。

脱管状态的实体信息不会同步到数据库,而是会从数据库中返回该持久化状态
在持久状态下,该实体对象的任何修改,都会同步到数据库中。

Hibernate对象的三种状态

  对象三种状态
  瞬时(transient) 数据库中没有数据与之对应 超过作用域会被JVM垃圾回收器回收 一般是new出来且与session没有关联的对象
  持久(persistent) 数据库中可能有数据与之对应(save) 当前与session有关联 并且相关联的session没有关闭 事务没有提交 持久对象状态发生改变 在事务提交时会影响到数据库(hibernate能检测到)
  脱管(detached) 数据库中可能有数据与之对应 但当前没有session与之关联 但是有oid;托管对象状态发生改变 hibernate不能检测到
  怎么样判断

阅读更多 >>>  hibernate框架用法,hibernate 框架

  是否与session有关 数据库是否有记录
  三种状态的转换
  瞬时状态
  通过new语句刚创建了一个java对象 他处于临时状态 此时不和数据库中的任何记录对应
  持久状态
  session的save()方法 瞬时对象 >转变为持久化对象
  session的load()方法和get()方法 返回的对象总是处于持久化状态
  session的update() saveOrUpdate() lock() 游离对象 >持久化对象
  当一个持久化对象关联一个临时对象 在允许级联保存的情况下 session在清理缓存时会把这个临时对象转变为持久化对象
  游离状态
  当调用session的close()方法时 session的缓存被清空 缓存中的所有持久化对象变为游离对象 如果在应用程序中没有引用变量引用这些游离对象 他们就会结束生命周期
  session的evict()方法能够从缓存中删除一个持久化对象 使他变为游离状态
  图像说明三者关系
save 瞬时状态 >持久状态 update 游离状态 >持久状态 saveOrRpdate 无法判断是瞬时还是游离 可调用此方法变为持久状态 会自动判断是瞬时还是游离 游离状态有可能会出现数据库没有信息了 但是仍旧有oid 会出现删除状态
如何判断对象状态 操纵持久化对象 save() Session 的 save() 方法使一个临时对象转变为持久化对象 Session 的 save() 方法完成以下操作: 把 News 对象加入到 Session 缓存中 使它进入持久化状态 选用映射文件指定的标识符生成器 为持久化对象分配唯一的 OID 在使用代理主键的情况下 setId() 方法为 News 对象设置 OID 使无效的 (一般自动生成) Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系 当 News 对象处于持久化状态时 不允许程序随意修改它的 ID(如何插入表中的对应关系)
计划执行一条 insert 语句 把Customer对象当前的属性值组装到insert语句中 只有当session清理缓存时 才会执行SQL insert语句 如果在save()方法之后 修改了持久化对象的属性值 session清理缓存时会额外执行SQL update语句(如下例) 在 行下添加修改姓名的代码 判断真正插入到数据库里的是什么 结果如下 【原理解释】 new出来的对象变成持久化状态 user与session关联 user发生的任何变化hibernate都知道 save出来的user还没有插入到数据库中 表中最终保存下来的是abc update() Session 的 update() 方法使一个游离对象转变为持久化对象 并且计划执行一条 update 语句 saveOrupdate() 该方法同时包含save和update方法 如果参数是临时对象就用save方法 如果是游离对象就用update方法 如果是持久化对象就直接返回 lishixinzhi/Article/program/Java/ky/201311/28664

do需要转换成什么对象

do需要转换成持久层对应的PO对象。
服务层把DO转换为持久层对应的PO。实体对象的生命周期在Hibernate应用中是一个很关键的概念,正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用。
而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程。在这过程中我们需要理解的就是实体对象生命周期中的三种状态。瞬时状态(Transient)、持久化状态(Persistent)和离线状态(Detached也叫做脱管状态。
含义
do用来构成一般现在时和一般过去时的疑问或否定式,其后要跟原形动词。在问句中,do在语法上是需要的,但习惯上可以省略(有时含主语),特别在口语中。I的前面加do是陈述句句型一般疑问句句型。解析:Ido...(用助动词于陈述句是强调说法),以do开头的疑问是一般疑问句,do具有多种词性和词义。构成疑问句和否定句,代替动词。用于加强语气。

数据文件的三种状态

临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;
2.
持久化状态(Persistent):与session关联并且在数据库中有相应数据。已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;
3.
游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。
查看更多

hibernate 对象是放到哪个缓存

在hibernate中实体类对象有三种状态
(1)瞬时态(临时态)      
瞬时态:即我们自己创建一个对象,还没有保存到数据库就叫临时态,其实也可以说是对像没有id值,跟session没有关系(或者是一级缓存中不存在),即是临时态。
(2)持久态
持久态:即,此对象是我们从数据库中获取到的,即是持久太,简单的说就是,对象有id值,跟session有关系(或者说是一级缓存中存在),即是持久态。
(3)托管态(游离态)
托管态:即,此对象有id值,但是跟session 没有关系(或者说是一级缓存中不存在),即是托管态。
瞬时态———通过保存方法———持久态———通过get()方法———游离态。
其中实体类对象的状态会影响到方法的执行:
就比如saveOrUpdate()方法执行的时候:
(1)对象是瞬时态的话,会执行insert语句。
(2)对像是托管态的时候就会做修改操作(update)
(3)持久态的时候也能做修改操作,但是这里就涉及到持久态对象会在事物的提交的时候自动跟新到数据库。
问候一下hibernate一级缓存他老人家
数据一般是存在数据库里面,而数据库本身是一个文件系统,而文件系统的读取就需要用到文件流了,而读取数据的时候使用文件流的方式操作,效率不是很高的,而考虑到这种情况,我们就可以想想
是不是可以把数据放到系统的内存中去从而提高数据的读取效率,而把数据放到系统的内存中去就是我们所说的缓存数据,即缓存。
那什么是hibernate缓存呢?
那就是hibernate提供了一种优化的方式,可以把数据直接放到内存中,这就是hibernate缓存,其实hibernate一级缓存是hibernate框架中的一种优化的机制。(优化机制我自己的理解就是一种提高程序或者框架性能或者效率的一种“方法”)。
hibernate一级缓存默认是打开的。
hibernate一级缓存有它的使用范围那就是session范围(从session创建到session关闭(事物提交或者手动关闭session)。
一级缓存的道路怎么走
在查询数据库的数据时候,hibernate首先去查的不是数据库,而是一级缓存区域,会先去一级缓存中去查询,如果查询的结果存在那就直接返回不会再去数据库中查询数据,但是如果查询的数据一级缓存中不存在,
那就会去数据库中去查,从数据库中拿到数据之后会同时做两件事那就是把查询的数据返回还有就是把数据放到一级缓存中的缓存区以及快照区中,那我们第二次再次查询这个数据的时候就会直接从缓存中查询就不会进入数据库中进行查询了。
这样就可以减少对数据库的操作,从而达到提高程序的性能以及效率。
一级缓存中的家族产业
一级缓存分为:缓存区和快照区。
缓存区:就比如我们在调用hibernate中的调用方法查询到数据库并拿到了数据库对象的时候,hibernate会首先把查询的数据对象放到一级缓存和快照区中,但是当我们对这个对象我们查询的数据对象进行修改的时候(当然对象必须在存在于Hibernate一级缓存中且session没有关闭的情况下。)我们修改的只是修改缓存区中的内容,而不会修改快照区的内容,这是一个最重要的机制,我感觉这钟机制真的很牛bi,hibernate只是修改缓存中的数据,而不修改快照区中的内容,但是在提交事物的时候hibernate框架会自动的去拿缓存区和快照区的内容进行对比,如果快照区与缓存区的内容是一致的,那就不会去更新到数据库,但是如果是不一样的那就会自动的更新到数据库。这种机制又是提高Hibernate框架的执行效率。
快照区:快照区,什么是快照区,快照区为什么叫快照区,其实可以这么理解快照区,快照区就是存放照片的,只不过是这个照片有点独特,那就是这个照片是从数据库中拿到的数据的照片。快照区所做的事就是在数据放入缓存区的同时对数据进行“拍照”对其进行记录。以便在以后缓存区中的数据修改的时候进行对比看数据是否发生了变化,如果变化那就更新到数据库,其实到这里也就容易理解为什么我们在修改对象的时候缓存区中的数据会发生相应的改变而快照区不会发生改变了。是因为快照区中存的是“照片”嘛。照片的内容我们是改变不了的。

网站数据信息

"hibernate的三种状态,hibernate对象的三种状态是什么?"浏览人数已经达到17次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:hibernate的三种状态,hibernate对象的三种状态是什么?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!