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) 瞬时状 ...
随机推荐
- 来自极客头条的 35 个 Java 代码性能优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- centos7安装单机rocketmq,图文教程
系统环境 1.操作系统:64位CentOS Linux release 7.2.1511 (Core) 2.jdk版本:1.8.0_121 3.IP地址:192.168.1.210 下载rocketm ...
- JNI编程实现(Linux)
JNI是Java Native Interface的缩写,是Java平台的本地调用,从Java1.1就成为了Java标准的一部分,它允许Java代码和其它语言的代码进行互相调用,只要调用约定支持即可, ...
- Android笔记(六):线程及线程通信
线程 由于Android的Activity中默认所有代码都在主线程(UI线程)中执行,如果在这里面执行耗时任务(例如下载),界面就会无反应且不可操作,直到耗时任务执行完毕. 如果想在执行耗时任务的同时 ...
- Unity3d之截图方法
http://blog.csdn.net/highning0007/article/details/37991787 Unity3d之截图方法 分类: Unity3D2013-11-28 17:13 ...
- Effective C++ 条款46
本节条款:须要类型转换时请为模板定义非成员函数 这节知识是在条款24的基础上,讲述的有关非成员函数在模板类中(non-member function template)的作用. 我们先看一下条款24讲 ...
- Android apk签名的两种方法
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 为了保证 ...
- C# Callback思维
方式一.用委托作为形参,把结果传回实参方式二.通过接口实现方式三.通过事件关联,适用桌面应用程序方式四.子窗体调用父窗体的函数(委托) 方式一.用委托作为形参,把结果传回实参 public parti ...
- ionic build - 修改gradle路径提升速度和成功率
ionic build 不成功很多时候是因为下载gradle太慢, 我们可以下载好gradle然后修改配置文件, 从而省去这个烦人的下载过程 1. 下载报错时的gradle zip文件, 或者直接查看 ...
- List or delete hidden files from command prompt(CMD)
In Windows, files/folders have a special attribute called hidden attribute. By setting this attribut ...