Hibernate早已成为java社区ORM的事实标准,使用者众多。在Hibernate中,数据的增删改查以及数据库连接、事务等都是通过Session接口来操作,因此可以认为Session是整个Hibernate的中心枢纽。使用Hibernate时间久了,有时候都忘了程序是怎么跟数据库进行交互的了,这可不应该,趁最近有时间,得赶紧温习一下。
先从翻译Hibernate Session的Javadoc开始。
org.hibernateInterface Session
All Superinterfaces: Serializable , SharedSessionContract
All Known Subinterfaces: EventSource
All Known Implementing Classes: SessionDelegatorBaseImpl , SessionImpl
public interface Session extends SharedSessionContract
Java应用程序与Hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。
Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)
Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态存在:
- 自由状态(transient): 不曾进行持久化,未与任何Session相关联
- 持久化状态(persistent): 仅与一个Session相关联
- 游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联
游离状态的实例可以通过调用 save()、persist() 或者 saveOrUpdate ()方法进行持久化。持久化实例可以通过调用 delete() 变成游离状态。通过 get() 或 load() 方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate() 进行持久化。游离或者自由状态下的实例可以通过调用 merge() 方法成为一个新的持久化实例。
save() 和 persist() 将会引发SQL的INSERT, delete() 会引发SQL的DELETE,而update() 或 merge() 会引发SQL的UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL的UPDATE。 saveOrUpdate() 或者replicate() 会引发SQL的INSERT或者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的内部状态可能会与数据库失去同步。
See Also: SessionFactory
| Nested Class Summary | |
|---|---|
| static interface | Session.LockRequest 包含锁定的细节(LockMode、超时和范围) |
| Method Summary | ||
|---|---|---|
| Session.LockRequest | buildLockRequest ( LockOptions lockOptions) 使用指定的LockMode,悲观锁超时时间和锁定范围构建一个LockRequest | |
| IdentifierLoadAccess | byId ( Class entityClass) 创建一个IdentifierLoadAccess实例以根据主键检索指定的实体 | |
| IdentifierLoadAccess | byId ( String entityName) 创建一个IdentifierLoadAccess实例以根据主键检索指定的实体 | |
| NaturalIdLoadAccess | byNaturalId ( Class entityClass) 创建一个NaturalIdLoadAccess实例以通过其自然id检索指定的实体 | |
| NaturalIdLoadAccess | byNaturalId ( String entityName) 创建一个NaturalIdLoadAccess实例以通过其自然id检索指定的实体 | |
| SimpleNaturalIdLoadAccess | bySimpleNaturalId ( Class entityClass) 创建一个SimpleNaturalIdLoadAccess实例以通过其简单的(单属性)自然id检索指定的实体 | |
| SimpleNaturalIdLoadAccess | bySimpleNaturalId ( String entityName) 创建一个NaturalIdLoadAccess实例以通过其自然id检索指定的实体 | |
| void | cancelQuery () 终止执行当前查询 | |
| void | clear () 完全清除当前会话(Session) | |
| Connection | close () 停止这个Session,通过中断JDBC连接并且清空(cleaning up)它 | |
| boolean | contains ( Object object) 检查这个对象实例是否与当前的Session关联(即是否为Persistent状态) | |
| Query | createFilter ( Object collection, StringqueryString) 根据给定的collection和过滤字符串(查询条件)创建一个新的Query实例 | |
| void | delete ( Object object) 从数据库中移除持久化(persistent)对象的实例 | |
| void | delete ( String entityName, Object object) 从数据库中移除持久化(persistent)对象的实例 | |
| void | disableFetchProfile ( String name) 禁止在这个会话中获取特定配置文件 | |
| void | disableFilter ( String filterName) 禁用当前session的名称过滤器 | |
| Connection | disconnect () 断开Session与当前的JDBC连接 | |
| doReturningWork ( ReturningWork <T> work) 控制器允许用户使用当前Session管理的连接执行JDBC相关工作 | |
| void | doWork ( Work work) 控制器允许用户使用当前Session管理的连接执行JDBC相关工作 | |
| void | enableFetchProfile ( String name) 允许在这个会话中获取特定配置文件 | |
| Filter | enableFilter ( String filterName) 允许在当前Session中使用名称过滤器 | |
| void | evict ( Object object) 将当前对象实例从session缓存中清除 | |
| void | flush () 强制提交清理(flush)Session | |
| Object | get ( Class clazz, Serializable id) 根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null | |
| Object | get ( Class clazz, Serializable id, LockModelockMode) 过期的方法: 根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null | |
| Object | get ( Class clazz, Serializable id, LockOptions lockOptions) 根据给定的主键标示符返回给定的实体类的持久化实例,如果没有这样的持久实例返回null | |
| Object | get ( String entityName, Serializable id) 返回与给定的实体命名和标识匹配的持久化实例,如果没有对应的持久化实例则返回null | |
| Object | get ( String entityName, Serializable id, LockMode lockMode) 过期的方法 : 返回与给定的实体类和标识所匹配的持久化实例,如果没有对应的持久化实例则返回null | |
| Object | get ( String entityName, Serializable id, LockOptions lockOptions) 根据给定的主键标示符返回给定的实体类的持久化实例,如果没有这样的持久实例返回null | |
| CacheMode | getCacheMode () 根据给定的主键标示符返回给定的实体类的持久化实例,如果没有这样的持久实例返回null | |
| LockMode | getCurrentLockMode ( Object object) 检测给定对象当前的锁定级别 | |
| Filter | getEnabledFilter ( String filterName) 根据名称获取一个当前允许的过滤器(filter) | |
| String | getEntityName ( Object object) 返回一个持久化对象的实体名称 | |
| FlushMode | getFlushMode () 获得当前的刷新提交(flush)模式 | |
| Serializable | getIdentifier ( Object object) 获取给定的实体对象实例在Session的缓存中的标识,如果该实例是自由状态(Transient)的或者与其它Session关联则抛出一个异常 | |
| LobHelper | getLobHelper () 检索当前会话中创建LOB实例的helper/delegate | |
| SessionFactory | getSessionFactory () 获取创建这个session的SessionFactory实例 | |
| SessionStatistics | getStatistics () 获取这个session的统计信息 | |
| TypeHelper | getTypeHelper () 方便的访问与当前会话的SessionFactory相关的TypeHelper | |
| boolean | isConnected () 检查当前Session是否处于连接状态 | |
| boolean | isDefaultReadOnly () 默认是否以只读模式加载实体/代理对象 | |
| boolean | isDirty () 当前Session是否包含需要与数据库同步的(数据状态)变化 ?如果我们刷新提交(flush)这个session是否会有SQL执行? | |
| boolean | isFetchProfileEnabled ( String name) 在当前Session中是否允许获取特定配置 | |
| boolean | isOpen () 检查当前Session是否仍然打开 | |
| boolean | isReadOnly ( Object entityOrProxy) 指定的实体或代理对象是否制只读 | |
| Object | load ( Class theClass, Serializable id) 在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例 | |
| Object | load ( Class theClass, Serializable id, LockModelockMode) 过期的方法: 在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例 | |
| Object | load ( Class theClass, Serializable id,LockOptions lockOptions) 在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例 | |
| void | load ( Object object, Serializable id) 将与给定的标示对应的持久化状态(值)复制到给定的自由状态(trasient)实例上 | |
| Object | load ( String entityName, Serializable id) 在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例 | |
| Object | load ( String entityName, Serializable id, LockMode lockMode) 过期的方法: 在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例 | |
| Object | load ( String entityName, Serializable id, LockOptions lockOptions) 在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例 | |
| void | lock ( Object object, LockMode lockMode) 过期的方法: 从给定的对象上获取指定的锁定级别 | |
| void | lock ( String entityName, Object object, LockMode lockMode) 过期的方法 从给定的 对象上获取 指定的锁定级别 | |
| Object | merge ( Object object) 将给定的对象的状态复制到具有相同标识的持久化对象上 | |
| Object | merge ( String entityName, Object object) 将给定的对象的状态复制到具有相同标识的持久化对象上 | |
| void | persist ( Object object) 将一个自由状态(transient)的实例持久化 | |
| void | persist ( String entityName, Object object) 将一个自由状态(transient)的实例持久化 | |
| void | reconnect ( Connection connection) 重新连接到给定的JDBC连接 | |
| void | refresh ( Object object) 从数据库中重新读取给定实例 | |
| void | refresh ( Object object, LockMode lockMode) 过期方法: 根据指定的锁定模式(LockMode),从数据库中重新读取给定实例的状态 | |
| void | refresh ( Object object, LockOptionslockOptions) 根据指定的锁定模式(LockMode),从数据库中重新读取给定实例的状态 | |
| void | refresh ( String entityName, Object object) 从底层数据库中从新读取给定实例 | |
| void | refresh ( String entityName, Object object,LockOptions lockOptions) 根据给定的锁定模式从数据库中重新读取给定实例 | |
| void | replicate ( Object object, ReplicationModereplicationMode) 使用当前的标识值持久化给定的游离状态(Transient)的实体 | |
| void | replicate ( String entityName, Object object,ReplicationMode replicationMode) 使用当前的标识值持久化给定的游离状态(Transient)的实体 | |
| Serializable | save ( Object object) 首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化 | |
| Serializable | save ( String entityName, Object object) 首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化 | |
| void | saveOrUpdate ( Object object) 根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行save() 或update()操作 | |
| void | saveOrUpdate ( String entityName, Objectobject) 根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行save() 或update()操作 | |
| SharedSessionBuilder | sessionWithOptions () 获得一个有能力从当前会话中抓住某些信息的会话创建者 | |
| void | setCacheMode ( CacheMode cacheMode) 设置缓存模式 | |
| void | setDefaultReadOnly (boolean readOnly) 设置是否默认以只读模式加载实体/代理对象到当前会话中 | |
| void | setFlushMode ( FlushMode flushMode) 设置刷新提交模式 | |
| void | setReadOnly ( Object entityOrProxy, boolean readOnly) 将一个未经更改的持久化对象设置为只读模式,或者将一个只读对象标记为可以修改的模式 | |
| void | update ( Object object) 根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例 | |
| void | update ( String entityName, Object object) 根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例 | |
本文深入探讨Hibernate Session接口的功能和作用,包括数据增删改查、数据库连接、事务管理等核心操作。解释了Session的生命周期及其与持久化状态的关系,并提供了典型事务处理的示例。

394

被折叠的 条评论
为什么被折叠?



