Hibernate中Session的操作解释

Hibernate JavaDoc (4.3.5.Final) 立即下载
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

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

如果这个session使用了积极的collection释放策略(如CMT-容器控制事务的环境下),关闭这个调用的连接的职责应该由当前应用程序负责。
 booleancontains(Object object)
          检查这个对象实例是否与当前的Session关联(即是否为Persistent状态)。
 CriteriacreateCriteria(Class persistentClass)
          为给定的实体类或它的超类创建一个新的Criteria实例。
 CriteriacreateCriteria(Class persistentClass, String alias)
          根据给定的实体类或者它的超类创建一个新的Criteria实例,并赋予它(实体类)一个别名。
 CriteriacreateCriteria(String entityName)
          根据给定的实体的名称(name),创建一个新的Criteria实例。
 CriteriacreateCriteria(String entityName, String alias)
          根据给定的实体的名称(name),创建一个新的Criteria实例,并赋予它(实体类)一个别名
 QuerycreateFilter(Object collection, String queryString)
          根据给定的collection和过滤字符串(查询条件)创建一个新的Query实例。
 QuerycreateQuery(String queryString)
          根据给定的HQL查询条件创建一个新的Query实例。
 SQLQuerycreateSQLQuery(String queryString)
          根据给定的SQL查询条件创建一个新的SQLQuery实例。
 voiddelete(Object object)
          从数据库中移除持久化(persistent)对象的实例。
 voiddelete(String entityName, Object object)
          从数据库中移除持久化(persistent)对象的实例。
 voiddisableFilter(String filterName)
          禁用当前session的名称过滤器。
 Connectiondisconnect()
          断开Session与当前的JDBC连接。
 FilterenableFilter(String filterName)
          打开当前session的名称过滤器。
 voidevict(Object object)
          将当前对象实例从session缓存中清除。
 voidflush()
          强制提交刷新(flush)Session。
 Objectget(Class clazz, Serializable id)
          根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
 Objectget(Class clazz, Serializable id, LockMode lockMode)
          根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
 Objectget(String entityName, Serializable id)
          返回与给定的实体命名和标识匹配的持久化实例,如果没有对应的持久化实例则返回null。
 Objectget(String entityName, Serializable id, LockMode lockMode)
          返回与给定的实体类和标识所匹配的持久化实例,如果没有对应的持久化实例则返回null。
 CacheModegetCacheMode()
          得到当前的缓存模式。
 LockModegetCurrentLockMode(Object object)
          检测给定对象当前的锁定级别。
 FiltergetEnabledFilter(String filterName)
          根据名称获取一个当前允许的过滤器(filter)。
 EntityModegetEntityMode()
          获取这个session有效的实体模式。
 StringgetEntityName(Object object)
          返回一个持久化对象的实体名称。
 FlushModegetFlushMode()
          获得当前的刷新提交(flush)模式。
 SerializablegetIdentifier(Object object)
          获取给定的实体对象实例在Session的缓存中的标识,如果该实例是自由状态(Transient)的或者与其它Session关联则抛出一个异常。
 QuerygetNamedQuery(String 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是否仍然打开。
 Objectload(Class theClass, Serializable id)
          在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。
 Objectload(Class theClass, Serializable id, LockMode lockMode)
          在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例。
 voidload(Object object, Serializable id)
          将与给定的标示对应的持久化状态(值)复制到给定的自由状态(trasient)实例上。
 Objectload(String entityName, Serializable id)
          在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。
 Objectload(String entityName, Serializable id, LockMode lockMode)
          在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例。
 voidlock(Object object, LockMode lockMode)
          从给定的对象上获取指定的锁定级别。
 voidlock(String entityName, Object object, LockMode lockMode)
          从给定的对象上获取指定的锁定级别。
 Objectmerge(Object object)
          将给定的对象的状态复制到具有相同标识的持久化对象上。
 Objectmerge(String entityName, Object object)
          将给定的对象的状态复制到具有相同标识的持久化对象上。
 voidpersist(Object object)
          将一个自由状态(transient)的实例持久化。
 voidpersist(String entityName, Object object)
          将一个自由状态(transient)的实例持久化。
 voidreconnect()
          不推荐的。 手工的重新连接只应用于应用程序提供连接的情况,在这种情况下或许应该使用reconnect(java.sql.Connection)。
 voidreconnect(Connection connection)
          重新连接到给定的JDBC连接。
 voidrefresh(Object object)
          从数据库中重新读取给定实例的状态。
 voidrefresh(Object object, LockMode lockMode)
          根据指定的锁定模式(LockMode),从数据库中重新读取给定实例的状态。
 voidreplicate(Object object, ReplicationMode replicationMode)
          使用当前的标识值持久化给定的游离状态(Transient)的实体。
 voidreplicate(String entityName, Object object, ReplicationMode replicationMode)
          使用当前的标识值持久化给定的游离状态(Transient)的实体。
 Serializablesave(Object object)
          首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。
 Serializablesave(String entityName, Object object)
          首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。
 voidsaveOrUpdate(Object object)
          根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save() 或update()操作。
 voidsaveOrUpdate(String entityName, Object object)
          根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save() 或update()操作。
 voidsetCacheMode(CacheMode cacheMode)
          设置刷新提交模式。
 voidsetFlushMode(FlushMode flushMode)
          设置刷新提交模式。
 voidsetReadOnly(Object entity, boolean readOnly)
          将一个未经更改的持久化对象设置为只读模式,或者将一个只读对象标记为可以修改的模式。
 voidupdate(Object object)
          根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。
 voidupdate(String entityName, Object object)
          根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。
多个linux系统安装到一块硬盘(Kylin+UOS+ubuntu) 之前写过一篇类似的文档,笔者把kylin和UOS安装在一块硬盘上上一篇的文档地址多个linux系统安装到一块硬盘(Kylin+UOS)_银河麒麟系统和uos安装成双系统-优快云博客本次记录的是三个系统到一块硬件上银河麒麟:Kylin-Desktop-V10-SP1-Release-2107-arm64统信:uniontechos-desktop-20-professional-1050-arm64乌班图:ubuntu-22.04.5-live-server-arm64。 阅读详情

相关推荐

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 207

hibernate中文网 第二章 体系结构(Architecture) 2021-05-22 ~ 2021-05-24

2.1. 概况(Overview) 一个非常简要的Hibernate体系结构的概要图: 从这个图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。 我们来更详细地看一下Hibernate运行时体系结构。由于Hibernate非常灵活,且支持多种应用方案, 所以我们这只描述一下两种极端的情况。“轻型”的体系结构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务。这种方案使用了Hibernate API的最小子集: “全面解决”的体系结..

aiwokache的博客 400

深入浅出一文搞懂Raft协议

前言 在分布式的世界里,要说最核心最复杂的功能,一致性的实现无出其右,之前的paxos算法堪称经典,被认为是同类算法中效果最好的,基本上成为分布式一致性的代名词,但是paxos算法也是出了名的难理解,而且相当不好实现。本人也花了很多时间、看了很多材料也没有真正理解。所以基于paxos的思想进行的一致性算法的简化和实现就成为了现实的需求,在此背景下,本文的主角Raft就出现了。 Raft算法的头号目标就是容易理解(UnderStandable),这从论文中就可以看出来。当然,R...

microGP的专栏 6485

扩展 Hibernate 对各类数据源支持

本文将介绍两种如何在 Hibernate 项目中使用自定义数据源的方法。Hibernate内嵌了对C3P0,Proxool,JNDI数据源等数据库连接池的支持。但当我们需要使用除了这几个数据源外的其他数据源的时候就有问题了,例如我们需要用Apache的开源连接池项目DBCP,或者说我们想要使用多数JDBC驱动程序中自带的XxxxDataSource时,Hibernate就没有提供对这方面的支持

在水一方 927

卡门涡街可视化实战:从网格加密策略到动画后处理技巧

本文详细介绍了利用ANSYS Fluent进行卡门涡街可视化模拟的全流程,包括网格加密策略、求解器设置、涡街捕捉及动画后处理技巧。通过计算流体力学(CFD)方法,帮助工程师和研究人员高效模拟圆柱绕流现象,优化工程设计。

weixin_29309785的博客 414

高精度磁力计RM3100 传感器LR振荡电路偏置电路分析

LR振荡器电路通过正向和反向偏置实现磁场测量。Sen-XY-f/Z-f传感器线圈作为电感元件构成LR弛张振荡电路,其振荡频率随磁场变化而改变。测量时,线圈一端接地,另一端交替通入正反向电流,通过两次偏置测量消除电路自身磁场干扰,仅保留外部磁场影响。MagI2C芯片通过高速时钟测量振荡次数和时间差,计算磁场强度。该设计具有抗干扰强、数字化输出和高分辨率等优势,是RM3100传感器高精度磁测量的核心原理。

bother3000的博客 1135

翻译的Hibernate的Session的javadoc

Hibernate的透明持久化用起来非常舒服,有时甚至忘记了数据库的存在。我身边的朋友经常会分不清save、saveOrUpdate、 update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、detached的区别,只是知道PO、VO这样的通俗叫法。其

yzhjisji的专栏 536

Git下载安装及环境配置,解决安装包下载慢问题(详细版)

Git是我们平时开发都要用到的项目管理工具,虽然有网页版的Git网站,但是在本地安装Git后,可以直接使用命令语句来进行项目的上传与克隆。还是非常方便的。今天就来介绍下Git的下载。1、首先在浏览器中搜索Git,进入到Git的官方下载界面或者直接复制下面这个链接。 2、点击download进入下载界面,选择自己需要平台的文件 3、下载标准版就可以4、但是会发现下载速度很慢,就找个镜像版 5、点击 https://registry.npmmirror.com/binary.html?path=git-for-

mengxiang_的博客 6万+

从hibernate源代码角度解析, 关系维护 ,dirty检查 ,脏数据检查.. 级联区别 cascade区别.

首先理解 关系维护 cascade. 得先看两篇官方文章. 1. Chapter 21. Example: Parent/Child 21.1. A note about collections21.2. Bidirectional one-to-many 单向的没啥好讲的.只有一个人维护.21.3. Cascading life cycle21.4. Cascades

fei33423的专栏 3198

YOLOv12改进策略【Neck】| CGA Fusion:内容引导的注意力融合模块,空间权重引导的多模态特征自适应融合

本文记录的是利用CGA Fusion 模块改进 YOLOv12 的多模态融合部分。(Content-Guided Attention Fusion)通过内容引导注意力生成空间权重,引导高低层特征的自适应融合。本文利用模块,通过内容引导注意力生成空间权重,自适应地融合两个模态的特征,在特征融合阶段实现跨模态语义对齐与噪声抑制,增强对不同模态互补特征的利用能力,从而提升模型在多模态场景下的检测鲁棒性与准确性。DEA-Net: Single image dehazing based on detail-enhan

Limiiiing的博客 434

ABAP 7.40 新语法介绍系列之二 - ABAP 类型转换操作符 CONV

这个lv_input_s变量的唯一使命,就是接收来自 char10 类型的 lv_input_c 变量的值,然后传递到 print 方法里去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1419

Hibernate框架详解(二)

实体类编写规则 实体类里面属性私有 私有属性使用公开的set和get方法操作 要求实体类有属性作为唯一值(一般使用id值) 实体类属性建议不使用基本数据类型,而使用基本数据类型对应的包装类(使用八个基本数据类型对应的包装类)。例如要表示学生的分数(使用int score),如果学生得了0分,表示为int score=0;如果学生没有参加考试,使用int score=0不能准确表示学生是否参...

m0_37671741的博客 366

8155源码编译DSP(ubuntu环境下)

一.设置环境变量 -users:/$ sudo gedit ~/.bashrc #set adsp cdsp tools path #export ARMLMD_LICENSE_FILE=<LICENSE FILE INFO> #export ARMTOOLS=RVCT221 #export ARMROOT=/pkg/asw/compilers/arm/ADS1.2 #export ARM_COMPILER_PATH=/pkg/qct/software/arm/RVDS/2.2BLD593

Johnny2004的专栏 1676

hibernate中session的操作解释

Hibernate中Session的操作解释 2006-05-16 12:49 4208人阅读 评论(0) 收藏 举报 sessionhibernateobjectstring数据库javadoc Hibernate的透明持久化用起来非常舒服,有时甚至忘记了数据库的存在。我身边的朋友经常会分不清save、saveOrUpdate、 update的区别,lock、merge、re...

weixin_30414245的博客 84

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Hibernate中session的关闭问题

Hibernate中session的关闭问题实现一个修改客户信心的功能,分为两部分:一、点击修改,跳转到后台,然后执行根据id查询客户信息的 操作,并将查询到的客户信息回显到前台。二、前台将修改完的信心提交到后台,后台执行对用户信息更新 的操作。两部分的service层的代码如下: 第一部分,根据客户id查找客户信息 public Customer serachCustomerByI

u014580622的博客 6078

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate 通过Session操作数据库

1.Session提供了保存,更新,删除和加载Java对象的方法 2.Session具有一个缓存(Hibernate一级缓存), 位于缓存中的对象称为持久化对象,它和数据库中相关的记录对应 Session能够在某些时间点,按照缓存中的对象的变化来执行相关的 SQL语句,从而同步更新数据库(刷新缓存) Session缓存中的对象数据与数据库中的数据保存一致 flush() 在Trans

Paige's Blog 960

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

HttpSesion对象 与 Hibernate中的session 的区别?

首先这两个session除了名字一样没有任何联系的。(这是很重要的)  然后分别说下:HttpSession是severlet中的会话机制,也是jsp的内置对象,可以简单看做是个存储对象的一个作用域。  而Hibernate Session是把JDBC的Connection和Transaction接口进行了简单的封装后的一个接口,即此Session主要用来管理对象的增、删、改、查和事务的,还有

u011088260的博客 617
上一篇: 在eclipse中设计BPMN 2.0工作流定义的基本步骤
下一篇: apache commons beanutils中类propertyUtils中的方法描述
bbewx
博客等级 码龄16年 29粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值