5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法
1. 持久化实体
Serializable save(Object obj) : 将obj对象变为持久化状态,该对象的属性将被保存到数据库。
void persist(Object obj) : 将obj对象转化为持久化状态,该对象的属性将被保存到数据库。
Serializable save(Object obj,Object pk) : 将obj对象保存到数据库,保存到数据库时,指定主键值。
void persist(Object obj,Object pk) : 将obj对象转化为持久化状态,保存到数据库时,指定主键值。
2. 根据主键加载持久化实体
News news = session.load(News.class,pk);
如果没有匹配的数据库记录,load()方法可能抛出HibernateException异常;如果在持久化注解中指定了延迟加载,则load()方法会返回一个未初始化的代理对象,这个代理对象并没有加载数据记录,直到程序调用该代理对象的某方法时,Hibernate才会访问数据库。
News news = session.get(News.class,pk);
立即访问数据库,如果没有对应的记录,get()方法返回null,而不是返回一个代理对象。
3. 更新持久化实体
一旦加载了该持久化实例后,该实体就处于持久化状态,在代码中对持久化实例所做的修改被保存到数据库。
程序对持久化实例所做的修改会在Session flush之前被自动保存到数据库,无须程序调用其他方法来将修改持久化。
News news = session.load(News.class,pk);
news.setTitle("新标题");
session.flush();
4. 更新脱管实体
当程序修改脱管对象的状态后,程序应该显示地使用新的Session来保存这些修改。
update()
merge()
updateOrSave()
1. 当需要使用update()来保存程序对持久化对象所做的修改时,如果不清楚该对象是否曾经持久化过,那么程序可以选择使用updateOrSave() 方法,该方法自动判断该对象是否曾经持久化过,如果曾经持久化过,就执行update()操作;否则将执行save()操作。
2. merge()方法不会持久化给定的对象。例如session.update(obj)之后,obj对象将会变成持久化状态;而执行session.merge(obj)代码后,obj对象依然不是持久化状态,merge()方法会返回obj对象的副本 -- -- -- 该副本处于持久化状态,与该session关联。
3. 当程序使用merge()方法来保存程序对脱管对象所做的修改时,如果Session中存在相同持久化标识的持久化对象,merge()方法里提供的对象状态将覆盖原有持久化实例的状态。如果Session中没有相应的持久化实例,则尝试从数据库中加载,或者创建新的持久化实例,最后返回该持久化实例。
5. 删除持久化实例
使用delete() 方法来删除持久化实例
News news = session.load(News.class,pk);
session.delete(news);
啦啦啦
提示:
1. 如果News的标识属性(identifier)时generated类型的,那么Hibernate将会在执行save()方法时自动生成标识属性值,并将标识属性值分配给该News对象,并标识属性会在save()被调用时自动产生并分配给News对象。如果News的标识属性时assigned类型的,或者时复合主键(composite key),那么该标识属性值应当在调用save()之前手动赋给News对象。
2. save()方法需要立即返回持久化对象的标识属性值,所以程序执行save()方法会立即将持久化对象对应的数据插入数据库;
3. persist()则保证当它在一个事务外部被调用时,并不立即转换成insert语句。在需要封装一个长会话流程时候,persist()方法尤为重要。
4. load()方法和get()方法的主要区别在于是否延迟加载,使用load()方法将具有延迟加载功能。
5. 锁模式:使用load()或get()方法加载持久化对象时,可以制定一个“锁模式”参数。Hibernate使用LockOptions对象代表“锁模式”,LocakOptions提供了READ和UPGRADE两个静态属性来代表共享、修改锁。如果需要加载某个持久化对象以供修改(相当于使用SQL的select...for update语句来装载对象),则可用如下代码:
News news = 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);
啦啦啦
啦啦啦
5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法的更多相关文章
- 5 -- Hibernate的基本用法 --4 1 创建Configuration对象
org.hibernate.cfg.Configuration实例代表了应用程序到SQL数据库的配置信息,Configuration对象提供了一个buildSessionFactory()方法,该方法 ...
- Winform CheckBox组,先横向排列,后纵向排列,点击文字,改变Checkbox的状态的方法
开始选用的CheckedListBox控件,不能实现,改为使用ListView控件,可以满足需求.操作步骤如下: 1.将ListView的属性View改为SmallIcon. 2.CheckBox ...
- 5 -- Hibernate的基本用法 --2 2 Hibernate的数据库操作
在所有的ORM框架中有一个非常重要的媒介 : PO(持久化对象:Persistent Object).持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增.删.改的操作 ------ ...
- 【Hibernate步步为营】--核心对象+持久对象全析(三)
上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的.并且是通过用法来控制它们的转化过程.详细的转化过程今天就来着重讨论下 ...
- Hibernate.initialize(Obj)用法
导读: 在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制.而配置文件 ...
- 5 -- Hibernate的基本用法 -- 要点
Hibernate的基本用法 ⊙ ORM的基本知识 ⊙ ORM和Hibernate的关系 ⊙ Hibernate的基本映射思想 ⊙ Hibernate入门知识 ⊙ 使用Eclipse开发Hiberna ...
- 5 -- Hibernate的基本用法 --4 深入Hibernate配置文件
Hibernate的持久化操作离不开SessionFactory对象,这个对象是整个数据库映射关系经过编译后的内存镜像,该对象的openSession()方法可打开Session对象.该对象通常由Co ...
- hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了
hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...
- Hibernate持久化对象状态
在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...
随机推荐
- Codeforces Round #410 (Div. 2) 题解 【ABCD】
A 题意:问你恰好修改一个字符,能不能使得字符串变成回文串 题解:显然直接for一遍,如果长度为偶数,那么不一样的必须是1个:如果长度为奇数,那么不一样的也可以是0个 #include<bits ...
- linux <<eof
在平时的运维工作中,我们经常会碰到这样一个场景:执行脚本的时候,需要往一个文件里自动输入N行内容.如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢 ...
- C#高级编程9 第17章 使用VS2013-C#特性
C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...
- reac-native环境搭建
转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native%E7%8E%AF%E5%A2%83%E6%90% ...
- spring cloud: 使用consul来替换config server
上一篇提到了,eureka 2.x官方停止更新后,可以用consul来替代,如果采用consul的话,其实config server也没必要继续使用了,consul自带kv存储,完全可以取代confi ...
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
今天在手机上调试运行Andorid项目时,发现Console打印出"WARNING: Application does not specify an API level requiremen ...
- MX4_ADB
一.Ubuntu环境1. 建立或修改文件 ~/.android/adb_usb.ini,在文件开头或末尾添加一行,内容是0x2a45. 2. 建立或修改文件 /etc/udev/rules.d/51- ...
- Unity3d之截图方法
http://blog.csdn.net/highning0007/article/details/37991787 Unity3d之截图方法 分类: Unity3D2013-11-28 17:13 ...
- solr之定时增量索引实现
solr本身就提供了一个工具库实现定时增量索引,但是我在使用的过程中发现会出现一些问题,目前遇到两点: 1.启动时总是报如下异常: ? 1 The web application [solr] reg ...
- Java的oauth2.0 服务端与客户端的实现
oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...