1. 持久化对象的状态:

  站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态

  Session 的特定方法能使对象从一个状态转到另一个状态

  临时对象:

    在使用代理主键的情况下,OID 通常为 null

    不处于 Session 的缓存中

    在数据库中没有对应的记录

  持久化对象(也叫托管):

    OID 不为 null

    位于 Session 缓存中

    若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应

    Session 在 flush 缓存时,会根据持久化对象的属性变化,来同步更新数据库

    在同一个 Session 实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象

  删除对象:

    在数据库中没有和其 OID 对应的记录

    不再处于 Session 的缓存中

    一般情况下,应用程序不该再使用被删除的对象

  游离对象(也称“脱管”):

    OID 不为 null

    不再处于 Session 缓存中

    一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

Session  中的方法:

  save 方法:

    1. 是一个临时对象变为持久化对象

    2. 为对象分配 ID

    3. 在 flush 刷新缓存时会发送一条 INSERT 语句

    4. 在 save 方法之前配置的 ID 是无效的

    5. 持久化对象的 ID 是不能被修改的

  persist 方法:

    与 save 方法类似

    与 save 方法的区别:在调用 persist 方法之前,若对象已经有 ID 了,persist 方法会抛出异常;而 save 不会

  get & load 方法:

    get 和 load 方法都能从数据库中获取记录

    区别:

      1. 执行 get 方法:会立即加载对象

          执行 load 方法:若不使用该对象,则不会立即执行查询操作,而返回一个代理对象

        get 是立即检索

        load 是延迟检索

      2. 若数据表中没有对应的记录

        get 返回 null

        在使用对象的时候 load 会抛出异常(因为 load 方法开始的时候是返回了一个代理对象,所以如果没有查找到记录,那么就会抛出异常)

      3. load 方法可能会抛出懒加载异常

        比如,在初始化代理对象之前,关闭了 Session

  

  update 方法:

    1. 若更新一个持久化对象,不需要显式的调用 update 方法,因为在调用 Transaction 的 commit 方法时,会先执行 Session 的 flush 方法

    2. 更新一个游离对象,需要显式的调用 Session 的 update 方法。update 方法可以把一个游离对象变为持久化对象。

    注意:

      1. 无论要更新的游离对象和数据表的记录是否一致,都会发送 UPDATE 语句。

       可以通过设置 .hbm.xml 文件的 class 节点设置 select-before-update=true(默认为false),但通常不需要设置该属性

      2. 若数据表中没有对应的记录,但调用了 update 方法,会抛出异常

      3. 当 update 方法关联一个游离对象时,如果 Session 的缓存中已经存在相同 OID 的持久化对象,会抛出异常, 因为在 Session 缓冲中不能有两个 OID 相同的对象!

  saveOrUpdate 方法:

    该方法同时包含了 save 与 update 方法的功能

      如果对象是游离对象,则执行 update 方法

      如果对象是临时对象,则执行 save 方法

    判断对象是游离对象还是临时对象的标准: java 对象的 OID 是否为 null

    注意:若对象的 OID 不为 null,但数据表中还没有和其对应的记录,会抛出一个异常

    了解:OID 值等于 id 的 unsaved-value 属性值的对象,也被认为是一个游离对象

  delete 方法:

    执行删除操作,只要 OID 和数据表中一条记录对应,就会准备执行 DELETE 操作,若 OID 在数据表中没有对应的记录,则抛出异常

    对象被删除后,由于 OID 还保存在对象中,所以不能进行 update 和 save 操作,但是可以通过设置 hibernate 配置文件中的 hibernate.use_identifier_rollback 属性为 true,使删除对象后,对象的 OID 置为 null

    

  evict 方法:

    从 Session 缓存中把指定的持久化对象移除

Hibernate Session对象核心方法的更多相关文章

  1. hibernate的session对象核心方法注意的问题

    1.session.save()方法 1).session.save()方法会使一个对象从临时状态转变为持久化状态. 2).session.save()方法会赋予持久化对象的OID属性一个ID值,以对 ...

  2. Hibernate中的session对象update方法的使用

    使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...

  3. 菜鸟学SSH(九)——Hibernate——Session之save()方法

    Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中.通过save()将持久化对象保存到数据库需要经过以下步骤: 1,系统根据指定的ID生成策略,为临 ...

  4. Hibernate查询对象的方法浅析

    Hibernate 查询对象是根据对象的id查询的,只要你有id (id唯一),则无论你是否其他字段与传过来的对象一致,都会查到该id在数据库对应的对象.若是在关联查询中,所关联表的id为空,即所查表 ...

  5. Hibernate4之session核心方法

    在学习session的核心方法之前,我们先了解下hibernate中几种对象的状态: 暂时状态:这样的状态就好像咱们公司请的暂时员工一样,他在公司里没有相关的资料和id. 特点:在使用代理主键的情况下 ...

  6. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Hibernate Session的delete()方法

    本文介绍Hibernate Session的delete()方法.delete()方法用于从数据库中删除与Java对象对应的记录.对应游离对象和持久化对象,delete语句会做出不同的反应. AD:  ...

  8. 初识 Asp.Net内置对象之Session对象

    Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...

  9. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Vue(小案例_vue+axios仿手机app)_图文列表实现

    一.前言 1.导航滑动实现   2.渲染列表信息时让一开始加载的时候就请求数据 3.根据路由的改变,加载图文的改变(实现用户访问网站时可能执行的三个操作) 二.主要内容 1.导航滑动实现: (1)演示 ...

  2. Docker: 基础介绍 [一]

    一.Docker介绍 Docker是Docker.lnc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源 Do ...

  3. [JVM-4]Java内存模型(JMM)

    Java 内存模型 屏蔽掉各种硬件和操作系统的内存访问差异. 1 主内存和工作内存之间的交互 2 对于 volatile 型变量的特殊规则 关键字 volatile 是 Java 虚拟机提供的最轻量级 ...

  4. 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定

    一. 简介 1. DataAnnotations说明:EF提供以特性的方式添加到 domain classes上,其中包括两类:  A:System.ComponentModel.DataAnnota ...

  5. [物理学与PDEs]第1章习题4 偶极子的极限电势

    对在 $P_0$ 及 $P_1$ 处分别置放 $-q$ 及 $+q$ 的点电荷所形成的电偶极子, 其偶极距 ${\bf m}=q{\bf l}$, ${\bf l}=\vec{P_0P_1}$. 试证 ...

  6. Jasmine

    Jasmine https://www.npmjs.com/package/jasmine The Jasmine Module The jasmine module is a package of ...

  7. 高性能JS(读书札记)

    第一章:加载和执行 1.1脚本位置 将js脚本放在body底部 1.2组织脚本 文件合并,减少http请求(打包工具) 1.3无阻塞的脚本 js倾向于阻止浏览器的某些处理过程,如http请求和用户界面 ...

  8. 网络知识 - 简易的自定义Web服务器

    简易的自定义Web服务器 基于浏览器向服务端发起请求 两台主机各自的进程之间相互通信,需要协议.IP地址和端口号,IP表示了主机的网络地址,而端口号则表示了主机上的某个进程的地址,IP加Port统称为 ...

  9. android:shape 设置圆形

    组件高度和宽度设置为相同的值即可<?xml version="1.0" encoding="utf-8"?><shape xmlns:andr ...

  10. 第二周 数据分析之展示 Matplotlib基础绘图函数实例

    Pyplot基础图表函数 Pyplot饼图的绘制: Pyplot直方图的绘制: Pyplot极坐标图的绘制: Pyplot散点图的绘制: 单元小结: import numpy as np import ...