hibernate对象的三种状态

转载 2012年03月30日 11:07:06

Hibernate的透明持久化用起来非常舒服,有时甚至忘记了数据库的存在。我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、detached的区别,只是知道PO、VO这样的通俗叫法。其实这些概念都很简单,Hibernate的javadoc写的都很清楚,只需看看就能明白。所以我花了些时间将Hibernate 3.1.2中session的javadoc部分翻译了一下,旨在让那些因为Hibernate的“透明”而忘记了它基本概念的人们停下来再看看这些概念


--------------------------------------------------------------------------------

org.hibernate
Interface Session
All Superinterfaces:
Serializable
All Known Subinterfaces:
EventSource, Session
All Known Implementing Classes:
SessionImpl

--------------------------------------------------------------------------------

public interface Session
extends Serializable
Java应用程序与Hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。

Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)

Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态存在:

自由状态(transient): 不曾进行持久化,未与任何Session相关联
持久化状态(persistent): 仅与一个Session相关联
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联

游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。

save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE。

其具体实现并不一定是线程安全的。每个线程/事务应该从一个SessionFactory获取自己的session实例。

如果其持久化对象类是可序列化的,则Session实例也是可序列化的。

一个典型的事务应该使用下面的形式:

Session sess = factory.openSession();
Transaction tx;
try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
}
catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
}
finally {
     sess.close();
}

如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步。


Author:
Gavin King
See Also:
SessionFactory

Hibernate实体对象的生命周期(三种状态详解)

Hibernate生命周期会经历三种不同的状态:    1.Transient(瞬态):实体对象在内存是自由存在的,即与数据库中的数据没有任何关系.换句话说就是:该实体从未与任何持久化上下文关联过,它...
  • jethai
  • jethai
  • 2016年08月28日 13:57
  • 1728

hibernate的对象三种状态说明

注明:文章从网上转载而来,做了适当修改。 hibernate的对象三种状态     transient(瞬时)     persistent(持久化)     detached(游离) 瞬时状态:  ...
  • u010503822
  • u010503822
  • 2016年03月13日 23:35
  • 3459

hibernate持久化对象的三个状态

Hibernate中的对象有3种状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象)。这三个状...
  • wangdan199112
  • wangdan199112
  • 2015年08月19日 12:14
  • 2220

Hibernate中对象的三种状态,以及三种状态间的转化方法

在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来被别人问到了,说是面试题,才发现它是重要的。对于需要持久化的JAVA对象,在它...
  • fangleijiang
  • fangleijiang
  • 2014年09月12日 10:55
  • 1756

Hibernate中Java对象的三种状态以及之间的转换 ----Hibernate_4

Hibernate中Java对象的三种状态和相互转换,
  • MXiaoChao
  • MXiaoChao
  • 2016年06月06日 22:22
  • 1423

hibernate中对象的状态有三种

一,首先hibernate中对象的状态有三种:瞬态、游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save()、saveOrUpdate()、get()、load...
  • tantexian
  • tantexian
  • 2016年01月18日 22:51
  • 937

Hibernate 对象的三种状态 持久状态 临时状态 游离状态

Hibernate里有三种对象状态:临时状态  (Transient)、持久状态(Persistent)、游离状态(Detached) 持久状态对象也叫PO (PersistentObject)  ...
  • yulinlin_fei
  • yulinlin_fei
  • 2016年07月25日 19:33
  • 2341

Hibernate实体对象的生命周期(三种状态详解)

Hibernate生命周期会经历三种不同的状态:    1.Transient(瞬态):实体对象在内存是自由存在的,即与数据库中的数据没有任何关系.换句话说就是:该实体从未与任何持久化上下文关联过,它...
  • hgd250
  • hgd250
  • 2008年08月06日 12:36
  • 4442

Hibernate中Java对象的三种状态及其转换

一、打开oracle数据库,登录scott账户,对scott账户进行测试 二、新建一个java项目,导入hibernate配置文件及scott账户下测试表的映射文件 1.创建java项目 2.打开...
  • MaoFachang
  • MaoFachang
  • 2017年01月02日 09:59
  • 599

hibernate三种状态

最初学习hibernate三种状态时,听的有些似懂非懂,之后的逐渐理解,对它慢慢有了自己的理解,并且通过一个小例子更是能对这三种状态更加清晰。以下是我的总结。 1,hibernate三种状态 Tr...
  • hanxuemin12345
  • hanxuemin12345
  • 2014年07月08日 19:44
  • 8789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate对象的三种状态
举报原因:
原因补充:

(最多只允许输入30个字)