图解:

1):瞬时状态(Transient)

  对象与session没有关联,数据库中没有对应的数据。

  一般new出来的对象便是瞬时对象。

  对瞬时对象使用save()方法便使之成为持久对象。

  由于数据库中没有对应的数据,所以对瞬时对象使用update()方法无效。

2):持久状态(Persistent)

  对象与session有关联,且数据库中有对应id的数据。

  使用get()、load()等方法获得的是持久对象。

  对瞬时对象使用save()方法便使之成为持久对象。

  对游离对象使用update()方法便使之成为持久对象。

  对持久对象使用delete()方法使使之成为瞬时对象。

3):游离状态(Detached)

  对象与sessions没有关联,但数据库中有对应id的数据。

  对瞬时对象使用setId()方法,且数据库中有对应id的数据时,该对象便成为游离对象。

  当对象为持久状态时,对session执行close()、clear()、evict()等方法后,该持久对象变为游离对象。

  对游离对象使用delete()方法便使之成为瞬时对象。

  对游离对象使用update()方法便使之成为持久对象。

  由于数据库中已经存在对应id的数据,所以对游离对象使用save()方法无效。

hibernate涉及的脏检查:

  当事务提交时(commit),hibernate会检查session中处在持久状态的对象, 判断与数据库是否一致,不一致则会将缓存里面的数据更新掉数据库里面的数据!

那么session什么时候刷新缓存:

  1、执行commit方法时 //执行脏检查

  2、session.flush(); //不会提交事务执行脏检查

更新数据的方法:

update(对象):

saveOrUpdate(对象):

 1、通过id查询主键,存在就更新,不存在就新增!

 2、当mapping配置文件的generator节点的class属性不为assigned时,造成只有update没select时,更改class为assigned可以解决!

 3、不会发起查询,直接更新 merge(对象):合并,先查询,与缓存里面的数据比较一样时不做任何操作,不一样时,再更新或者插入!效率更高!

saveOrUpdate(对象)与merge(对象)方法:

1、主键生成策略:

  assigned 操作一样!

2、SQL语句不同:

  sequence,动态更新(dynamic-update="true")策略

  saveOrUpdate(对象)只更新

  merge(对象)先发起一条查询语句,在发起更新或者插入语句

分享知识-快乐自己:Hibernate对象的三种状态的更多相关文章

  1. hibernate对象的三种状态

    对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...

  2. Hibernate 对象的三种状态

    hibernate对象的三种状态: (一) 瞬时(临时)状态:   对象被创建时的状态,数据库里面没有与之对应的记录! (二) 持久状态:   处于session的管理中,并且数据库里面存在与之对应的 ...

  3. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  4. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  5. hibernate操纵数据库常用方法 及 hibernate对象的三种状态

    在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...

  6. Hibernate对象的三种状态,瞬时态、持久态、游离态

    1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...

  7. hibernate对象的三种状态及转换

    一.hibernate对象三种状态 Transient(瞬时状态):没有session管理,同时数据库没有对应记录 举例:new 出来的对象还没有被session管理,此时该对象处于Transient ...

  8. [转]Hibernate对象的三种状态

    在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...

  9. Hibernate(六)__对象的三种状态

    瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...

随机推荐

  1. vs 已经加入了引用,编译还是提示没有加入引用

    已经加入了引用,可是.编译还是通只是. 原因:项目总体框架是.Net FramWork4.5,nep中的框架也是4.5.而编译只是的project是4.0. 解决的方法:将编译只是的项目框架改为4.5

  2. 配置fio支持rbd測试引擎

    fio的rbd測试引擎能够非常方便的对rbd进行測试.以下示范怎样安装fio支持rbd引擎. git clone git://git.kernel.dk/fio.git $ cd fio $ ./co ...

  3. 【Sprint3冲刺之前】TD学生助手——alpha版发布

    TD学生助手——alpha版发布 1.设想和目标  1.我们的软件要解决的问题 TD学生助手的主要核心思想就是帮助学生安排他们忙碌的学校生活.主要是通过以下几个方面 1.通过学生的需要进行分类(考试, ...

  4. 你要的最后一个字符就在下面这个字符串里,这个字符是下面整个字符串中第一个只出现一次的字符。(比如,串是abaccdeff,那么正确字符就是b了)

    include "stdafx.h" #include<iostream> #include<string> using namespace std; in ...

  5. Linux模块机制浅析_转

    Linux模块机制浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/3730131.htmlLinux允许用户通过插入模块,实现干预内核的目的.一直以来,对l ...

  6. 把对象写入Postgresql中

    工作中,遇到把大对象写入Postgresql数据库中 package com.geni_sage.gdme.cws.dic; import java.io.BufferedInputStream; i ...

  7. 修复open-ssl漏洞,升级open-ssl版本

    升级openssl环境至openssl-1.0.1g 1.查看源版本 [root@zj ~]# openssl version -a OpenSSL 0.9.8e-fips-rhel5 01 Jul ...

  8. 【CF830C】Bamboo Partition 分块

    [CF830C]Bamboo Partition 题解:给你n个数a1,a2...an和k,求最大的d使得$\sum\limits_{i=1}^n((d-a[i] \% d) \% d) \le k$ ...

  9. EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:bootstrap弹窗功能的实现

    在web前端的网页设计中,为了展示出简洁的网页风格和美观的效果,往往就会使用弹窗效果 在EasyNVR前端页面录像检索功能时,必然会播放录像,如果单独为播放录像文件排一个界面,用户在使用上会更加繁琐, ...

  10. 小程序的生命周期 launchApp

    https://developers.weixin.qq.com/miniprogram/dev/api/launchApp.html?search-key=生命周期 launchApp(OBJECT ...