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);
啦啦啦
啦啦啦
最新文章
- Android Secret Code
- Java 清除数组相同元素
- 使用javaScript实现简单倒计时功能
- 浅尝辄止——在C++中调用C#的回调函数——COM方式
- python中re.findall()找到的结果替换
- 从3D Touch 看 原生快速开发
- android定位
- Aspose.cell.dll的使用,导excel表
- MFC可编辑的ListCtrl
- 解开Android应用程序组件Activity的";singleTask";之谜
- win10环境下python3.5安装步骤
- Masonry适配的简单使用
- React native和原生之间的通信
- java包
- jQuery使用(四):DOM操作之查找兄弟元素和父级元素
- perl二维数组
- List与Array互相转换
- 微服务架构与实践4_Docker
- 解决com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭
- ASP.NET MVC3 学习心得------路由机制
热门文章
- VirtualBox 扩展包卸载或安装失败(VERR_ALREADY_EXISTS)(转)
- 分布式理论——从ACID到CAP再到BASE
- Java 对象的序列化和反序列化
- 【linux】linux修改open file 大小
- 第十八章 dubbo-monitor计数监控
- inet_ntoa内存问题
- OpenSUSE 服务器系统部署
- Centos或Windows中部署Zookeeper集群及其简单用法
- CAP Twelve Years Later: How the ";Rules"; Have Changed
- 【RS】Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering - 基于拉普拉斯分布的稀疏概率矩阵分解协同过滤