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()


 

 

 

 

 

 

 

0 0