Chinaunix首页 | 论坛 | 博客
  • 博客访问: 863167
  • 博文数量: 221
  • 博客积分: 10033
  • 博客等级: 上将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-06 22:00
文章分类

全部博文(221)

文章存档

2010年(8)

2009年(1)

2008年(69)

2007年(63)

2006年(80)

我的朋友

分类: Java

2007-10-24 09:43:09

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:
All Known Subinterfaces:
EventSource, Session
All Known Implementing Classes:
SessionImpl

public interface Session
extends

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的INSERTdelete()会引发SQLDELETE,而update()merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATEsaveOrUpdate()或者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

Method Summary
 TransactionbeginTransaction()
          开始一个工作单元并且返回相关联的事务(Transaction)对象。
 voidcancelQuery()
          终止执行当前查询。
 voidclear()
          完整的清除这个session。
 close()
          停止这个Session,通过中断JDBC连接并且清空(cleaning up)它。
 connection()
          获取这个Session的JDBC连接。

如果这个session使用了积极的collection释放策略(如CMT-容器控制事务的环境下),关闭这个调用的连接的职责应该由当前应用程序负责。
 booleancontains( object)
          检查这个对象实例是否与当前的Session关联(即是否为Persistent状态)。
 CriteriacreateCriteria( persistentClass)
          为给定的实体类或它的超类创建一个新的Criteria实例。
 CriteriacreateCriteria( persistentClass,  alias)
          根据给定的实体类或者它的超类创建一个新的Criteria实例,并赋予它(实体类)一个别名。
 CriteriacreateCriteria( entityName)
          根据给定的实体的名称(name),创建一个新的Criteria实例。
 CriteriacreateCriteria( entityName,  alias)
          根据给定的实体的名称(name),创建一个新的Criteria实例,并赋予它(实体类)一个别名
 QuerycreateFilter( collection,  queryString)
          根据给定的collection和过滤字符串(查询条件)创建一个新的Query实例。
 QuerycreateQuery( queryString)
          根据给定的HQL查询条件创建一个新的Query实例。
 SQLQuerycreateSQLQuery( queryString)
          根据给定的SQL查询条件创建一个新的SQLQuery实例。
 voiddelete( object)
          从数据库中移除持久化(persistent)对象的实例。
 voiddelete( entityName,  object)
          从数据库中移除持久化(persistent)对象的实例。
 voiddisableFilter( filterName)
          禁用当前session的名称过滤器。
 disconnect()
          断开Session与当前的JDBC连接。
 FilterenableFilter( filterName)
          打开当前session的名称过滤器。
 voidevict( object)
          将当前对象实例从session缓存中清除。
 voidflush()
          强制提交刷新(flush)Session
 get( clazz,  id)
          根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
 get( clazz,  id, LockMode lockMode)
          根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
 get( entityName,  id)
          返回与给定的实体命名和标识匹配的持久化实例,如果没有对应的持久化实例则返回null。
 get( entityName,  id, LockMode lockMode)
          返回与给定的实体类和标识所匹配的持久化实例,如果没有对应的持久化实例则返回null。
 CacheModegetCacheMode()
          得到当前的缓存模式。
 LockModegetCurrentLockMode( object)
          检测给定对象当前的锁定级别。
 FiltergetEnabledFilter( filterName)
          根据名称获取一个当前允许的过滤器(filter)。
 EntityModegetEntityMode()
          获取这个session有效的实体模式。
 getEntityName( object)
          返回一个持久化对象的实体名称。
 FlushModegetFlushMode()
          获得当前的刷新提交(flush)模式。
 getIdentifier( object)
          获取给定的实体对象实例在Session的缓存中的标识,如果该实例是自由状态(Transient)的或者与其它Session关联则抛出一个异常。
 QuerygetNamedQuery( queryName)
          从映射文件中根据给定的查询的名称字符串获取一个Query(查询)实例。
 SessiongetSession(EntityMode entityMode)
          根据给定的实体模式(Entity Mode)开始一个新的有效的Session。
 SessionFactorygetSessionFactory()
          获取创建这个session的SessionFactory实例。
 SessionStatisticsgetStatistics()
          获取这个session的统计信息。
 TransactiongetTransaction()
          获取与这个session关联的Transaction(事务)实例。 instance associated with this session.
 booleanisConnected()
          检查当前Session是否处于连接状态。
 booleanisDirty()
          当前Session是否包含需要与数据库同步的(数据状态)变化 ?如果我们刷新提交(flush)这个session是否会有SQL执行?
 booleanisOpen()
          检查当前Session是否仍然打开。
 load( theClass,  id)
          在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。
 load( theClass,  id, LockMode lockMode)
          在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例。
 voidload( object,  id)
          将与给定的标示对应的持久化状态(值)复制到给定的自由状态(trasient)实例上。
 load( entityName,  id)
          在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。
 load( entityName,  id, LockMode lockMode)
          在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例。
 voidlock( object, LockMode lockMode)
          从给定的对象上获取指定的锁定级别。
 voidlock( entityName,  object, LockMode lockMode)
          从给定的对象上获取指定的锁定级别。
 merge( object)
          将给定的对象的状态复制到具有相同标识的持久化对象上。
 merge( entityName,  object)
          将给定的对象的状态复制到具有相同标识的持久化对象上。
 voidpersist( object)
          将一个自由状态(transient)的实例持久化。
 voidpersist( entityName,  object)
          将一个自由状态(transient)的实例持久化。
 voidreconnect()
          不推荐的。 手工的重新连接只应用于应用程序提供连接的情况,在这种情况下或许应该使用reconnect(java.sql.Connection)
 voidreconnect( connection)
          重新连接到给定的JDBC连接。
 voidrefresh( object)
          从数据库中重新读取给定实例的状态。
 voidrefresh( object, LockMode lockMode)
          根据指定的锁定模式(LockMode),从数据库中重新读取给定实例的状态。
 voidreplicate( object, ReplicationMode replicationMode)
          使用当前的标识值持久化给定的游离状态(Transient)的实体。
 voidreplicate( entityName,  object, ReplicationMode replicationMode)
          使用当前的标识值持久化给定的游离状态(Transient)的实体。
 save( object)
          首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。
 save( entityName,  object)
          首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。
 voidsaveOrUpdate( object)
          根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save()update()操作。
 voidsaveOrUpdate( entityName,  object)
          根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save()update()操作。
 voidsetCacheMode(CacheMode cacheMode)
          设置刷新提交模式。
 voidsetFlushMode(FlushMode flushMode)
          设置刷新提交模式。
 voidsetReadOnly( entity, boolean readOnly)
          将一个未经更改的持久化对象设置为只读模式,或者将一个只读对象标记为可以修改的模式。
 voidupdate( object)
          根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。
 voidupdate( entityName,  object)
          根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。
 
阅读(1746) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~