Hibernate——session的核心
来源:互联网 发布:Linux命令如何更换壁纸 编辑:程序博客网 时间:2024/05/17 21:06
一:持久化对象的四种状态
1.持久化状态(托管对象)
-OID 不为 null
-位于 Session 缓存中
-若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
-Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
-在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象
2.临时状态
-在使用代理主键的情况下, OID 通常为 null
-不处于 Session 的缓存中
-在数据库中没有对应的记录
3.游离状态(脱管对象)
-OID 不为 null
-不再处于 Session 缓存中
-一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录
4.删除状态
-在数据库中没有和其 OID 对应的记录
-不再处于 Session 缓存中
-一般情况下, 应用程序不该再使用被删除的对象
Session的特定方法能使对象从一个状态转换到另一个状态
二
Save()方法:
1. 它使一个临时对象变为持久化对象
2. 它为临时对象分配ID
3. 在flush()缓存时,会发送一条insert语句
4. 在save()方法之前的ID是无效的
5. 持久化对象的ID是不能修改的
persist()也会执行insert操作。
Persist和Save()之间的区别:
在调用persist()方法之前,若对象已经有Id,则不会执行insert,会抛出异常。而save()方法不会考虑是否有id,直接执行insert方法。
Get()方法:
get()和 load()之间的区别
1. 执行get()方法时,会立即加载对象。而执行load()时,若不适用该对象,则不会立即执行查询操作,而返回一个代理对象。
get()是立即检索,load()是延迟检索。
2. 若数据表中没有对应的记录,且Session也没有被关闭,同时需要使用对象时
get()返回null。
load()若不使用该对象的任何属性,没问题。若需要初始化,则会抛出异常。
3. Load()方法可能会抛出LazyInitalizationException(懒加载)异常:在需要初始化代理对象之前已经关闭了Session。
Update()
1. 若更新一个持久化对象,不需要显示调用update()方法,因为在调用Transation的commit()方法时,会先执行Session的flush()方法。
2. 更新一个游离对象,需要显示的调用session的update()方法,可以把一个游离对象变为持久化对象。
需要注意的点:
1. 无论要更新的游离对象和数据表的记录是否一致,都会发送update语句。
如何让update方法不再盲目的触发update语句?
在.hbm.xml文件的class节点设置一个 select-before-update=true(默认为false),但通常不需要设置该属性。
2. 若数据表中没有对应的记录,但还调用了update()方法会抛出异常。
3. 当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常。因为在Session缓存中不能有两个OID相同的对象。
saveOrUpdate():
• 判定对象为临时对象的标准
– Java 对象的 OID 为 null
– 映射文件中为 <id> 设置了 unsaved-value 属性, 并且 Java 对象的 OID 取值与这个unsaved-value 属性值匹配
注意:
1. 若OID不为空,但数据表中还没有何其对应的记录,会抛出一个异常。
2. 了解OID的值等于id的unsaved-value属性值的对象,也被认为是一个游离对象。
Delete():可以删除一个游离对象,也可以删除一个持久化对象。
只要OID和数据表中的一条记录对应,就会准备执行delete操作。
若OID在数据表中没有对应的记录,则抛出异常。
可以通过设置hibernate配置文件的use_identifier_rollback属性为true,使删除对象后把其OID置为NONE。
Evict():从session缓存中将相应的持久化对象移除
Dowork()
- Hibernate——session的核心
- Hibernate的核心接口--- Session
- Hibernate---session的核心方法.
- Hibernate中Session的核心方法一
- Hibernate学习——Hibernate的核心接口与类
- Hibernate学习——Hibernate的核心接口与类
- Hibernate Session 事务隔离级别回顾 持久化对象的状态 Session核心方法
- 精通Hibernate——Hibernate核心接口
- 【JavaEE—Hibernate】Hibernate核心api
- 【Hibernate】——核心对象
- Hibernate HelloWorld-03 session核心方法
- Hibernate学习笔记----session核心方法
- Hibernate—Hibernate Session生命周期示例
- Hibernate——session缓存
- javaee之hibernate—session
- Hibernate—session与transaction
- Hibernate的核心接口
- hibernate的核心接口
- hihocoder 1504 : 骑士游历 矩阵快速幂
- POJ 1265 Area(Pick定理、向量积求面积)
- CSU
- 表达式求值
- 数据结构-关联容器(C++)
- Hibernate——session的核心
- springMVC <spring:message>国际化
- Java学习之抽象类
- 图片轮播效果 面向对象方法
- bzoj 4598: [Sdoi2016]模式字符串 (hash+点分治)
- 关于python函数闭包问题
- hdu2258Continuous Same Game (1) (消消乐)
- 树莓派自启动
- Codeforces Round #408 (Div. 2) C. Bank Hacking 无根树、贪心、枚举