Hibernate的持久化对象状态的方法
1. 持久化实体
为了让瞬态对象转换为持久化状态,HibernateSession提供了如下几个方法。
1) Serialzable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。
2) void persist(Object obj):将obj对象转化为持久化状态,该对象的属性将被保存到数据库。
3) Serializable save(Object obj,Object pk):将obj对象保存到数据库,保存到数据库时,指定主键值。
4) void persist(Object obj,Objectpk):将对象转化为持久化状态,保存到数据库时,指定主键值。
为了将一个处于瞬态的对象变成持久状态,可以看如下的代码:
// 创建消息对象News n = new News();// 设置消息标题和消息内容n.setTitle("my title");n.setContent("owen,"+ "网站地址http://www.owen.org");// 保存消息sess.save(n);
程序执行save()方法会立即将持久化对象对应的数据插入数据库;而persist()则保证当它在一个事务外部被调用时,并不立即转换成insert语句。这个功能是很有用的,尤其需要封装一个长会话流程的时候,persist()方法就显得尤为重要了。
2. 根据主键加载持久化实体
程序可能通过load()来加载一个持久化实例,这种加载就是根据持久化类的标识属性值加载化实例——其实质就是根据主键从数据库中加载一条记录。
下面是直接加载持久化实体的代码:
News n = session.load(News.class, pk);
上面的代码中的pk就是需要加载的持久化实例标识属性。
当然,除了用load()的方法,我们也可以用get()的方法。load()方法和get()方法的主要区别在于是否延迟加载,使用load()方法将具有延迟加载功能,load()方法不会立即访问数据库,当试图加载的记录不存在时,load()方法可能返回一个未初始化的代理对象;而get()方法总是立即访问数据库,当试试图加载的记录不存在时,get()方法将直接返回null。
3. 更新持久化实体
程序对持久化实例实体所做的修改会在Sessionflush之前被自动保存到数据库,无须程序调用其它方法来将修改持久化。也就是说,修改对象最简单的方法就是Session处于打开状态load()它,然后直接修改即可。如果调用持久化实体的setter方法改变了实验室的属性,Hibernate会在Session flush之前生成一条update语句。
如下代码修改特定行的数据:
News n = session.load(News.class, pk);n.setTitle(“新标题”);session.flush();
4. 更新脱管实体
对于一个曾经持久化过、但现在已脱离了Session管理的持久化对象,它被认为处于脱管状态。当程序修改脱管对象的状态后,程序应该是显式地使用Session来保存这些修改。Hibernate提供了update()、merge()和updateOrSave()等方法来保存这些修改。例如下面的代码:
News n = firstSession.load(News.class, pk);
//第一个Session已经关闭了
firstSession,close();
//修改脱管状态下的持久对象
n.setTilte(“新标题”);
//打开第二个session…
Session secondSession = ….
//保存脱管对象所做的修改
secondSession.update(n);
merge()方法也可将程序对脱管对象所做的修改保存到数据库,但merge()与update()方法的最大区别是:merge()方法不会持久化给定的对象。举例来说,当程序执行session.update(a)代码后,a对象将会变成持久化状态;而执行session.merge(a)代码后,a对象依然不是持久化状态,a对象依然不会被关联到Session上,merge()方法会返回a对象的副本——该副本处于持久化对象。
5. 删除持久化实体
还可以通过Session的delete()方法来删除该持久化实例,一旦删除了该持久化,该持久化实例对应的数据记录也将被删除。代码如下:
News n = session.load(News.class, ok);
session.delete(n);
6. Hibernate的“锁模式”
使用load()或get()方法加载持久化对象时,还可指定一个“锁模式“参数。Hibernate使用LockOptions对象代表”锁模式“,LockOptions提供了READ和UPGRADE两个静态属性来代表共享、修改锁。如下代码:
News n = Session.get(News.class, pk, LockOptions.UPGRADE);
Session.LockRequest的lock()方法也将某个脱管对象重新持久化,但该脱管对象也必须是没有修改过的!如下代码:
//简单地重新持久化
session.buildLockRequest(LockOptions.NONE).lock(news);
//先检查持久化对象的版本,然后重新持久化该对象
session.buildLockRequest(LockOptions.READ).lock(person);
//检查持久化对象的版本,然后使用SELECT…FOR UPDATE重新持久化对象
session.buildLockRequest(New LockOptions(LockMode.PESSIMISTIC_WRITE)).lock(teacher);
Hibernate的持久化对象状态的方法相关推荐
- 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法
1. 持久化实体 Serializable save(Object obj) : 将obj对象变为持久化状态,该对象的属性将被保存到数据库. void persist(Object obj) : 将o ...
- Hibernate持久化对象状态
在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...
- Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程
HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...
- Hibernate开发和对象状态
Hibernate开发和对象状态 Hibernate开发三种方式 1.由Domain object -> mapping->db.(官方推荐) 2.由DB开始,用工具生成mapping和D ...
- hibernate教程--持久化类状态详解
一. Hibernate的持久化类状态: 1.1 Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态 ...
- hibernate教程--持久化类状态
一. Hibernate的持久化类状态: 1.1Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态. ...
- hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)
三态的基本概念: 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: ...
- hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)...
三态的基本概念: 1, 暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...
- Hibernate 几种对象状态
Hibernate 中四种对象状态 临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中.处于临时状态 的Java 对象被称为临时对象. 持久化状 ...
- hibernate中的PO持久化对象及PO三种状态
一,认识持久化对象PO: 在hibernate的应用程序中,每一个数据库中的表都对应一个持久化对象PO.PO可以看成是与数据库表相映射的java对象.最简单的PO对应数据库中某个表中的一条记录,多个记 ...
最新文章
- 把博士男友的论文和资料全删了,然后……
- rust如何进枪战服_天龙八部怀旧服九大门派详细打造攻略——少林篇
- Michael Jordan获2020IEEE冯诺依曼奖,曾培养吴恩达、Bengio
- 概率论-1.2概率的定义及其确定方法
- VB.NET实现DirectPlay(3)Find HOSTs
- 系统即将关机请保存关机是由nt_设置Windows电脑自动关机
- YbtOJ#20239-[冲刺NOIP2020模拟赛Day10]连边方案【状压dp】
- drools 规则流_约束流–没有Drools规则语言的现代Java约束
- 配置 Docker 加速器
- 新增或编辑保存时出错后,页面无法再次编辑
- 单例模式访问mysql设计类图_如何应用策略设计模式分离JDBC数据库连接中的外部环境信息...
- session用户账号认证(一个用户登陆,踢出前一个用户)
- 认识XinYiCMS从这里开始!
- 帮助机器人自由行走 思岚科技推出激光导航模块
- Numpy中的向量运算
- chrome://dino/让恐龙无敌的代码
- java的默认访问权限_java类的访问权限
- ffmpeg 实现音频aac编码
- Android lunch分析以及产品分支构建
- java 数学测试_Java实现小学数学练习
热门文章
- HTMLCSS学习笔记(三)----标签类型转换、样式重置
- 5.7.2.4 random() 方法
- GPS时钟装置,北斗卫星授时,ntp校时服务器,网络时间服务器
- 丽江,是否一群失意的人聚合地
- 完美解决:Could not open the editor: Editor could not be initialized
- avc水平什么意思_5个步骤切实有效地提高你的写作水平
- C++网络编程实例(初识多线程)
- @RestController与@RequestMapping
- 分享一个非常不错的SSH工具
- 20155332 缓冲区溢出漏洞实验