Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】
当new一个user的时候,是处于瞬时状态
当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 
当提交事务的时候,user对象才会存到DB中 
当调用session.close的时候,user对象会从session中出来,此时处于脱管状态
三种状态对象的区别:标准就是与session,与数据库的关系 
瞬时状态:与session,数据库无关 
持久状态:在session里,在数据库里,当持久化状态对象发生改变的时候,hibernate会检测到 
问题一:当调用了session.save(User)后,又调用了user.setName(“张三”),hibernate会自动检测到user对象的变化,问题是,hibernate是何时通知数据库的呢? 
答案是,在commit的时候。因为他不会根据程序调用一次set,就同步一次数据库,他会尽可能的减少与数据库就交互,会在commit()之前一次性的同步数据库。 
脱管状态:与session无关,但在数据库里有数据。 
什么时候用update()? 
当对象处于脱管状态的要想更新对象则调用update()、 
当对象处于瞬时状态的时候,则调用save()方法 
问题是,在写代码的时候,怎么知道状态是处于瞬时和脱管状态呢,一个好的方法是 
当不知道对象处于什么状态的时候,调用saveOrUpdate方法,让hibernate自己去判断。那么hibernate是怎么判断的呢,他也是根据对象的id或者Version来判断,当id=0的时候,对象处于瞬时状态。当id>0的时候,对象处于脱管状态。那么如果主键是String类型呢,则他会根据是否为Null来判断
三种状态的转变及调用什么方法可以转变?
通过new可以创建一个瞬时状态的对象 
通过save()或者saveOrUpdate()把瞬时状态变成持久化状态 
通过delete()方法把持久化状态变成瞬时状态 
通过evict()/close()/clear()把持久化状态变成脱管状态 
通过update()/savaOrUpdate()/lock()方法把脱管状态变成持久化状态 
通过get()或者load()或者find()或者iterate()等都能取得持久化状态的对象 
理解这几种状态的含义及使用,是非常有用的,只有明白了,在开发中才知道什么时候用什么方法。 
-----------------------------------------------华丽分割线-----------------------------------------------
Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于:
1.如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception.
2.load()方法可以返回实体的代理类实例,而get()永远只返回实体类.
3.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.
Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】的更多相关文章
- Hibernate中对象的三种状态及相互转化
		
1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下: Customer customer=new Customer(“ ...
 - JavaWeb_(Hibernate框架)Hibernate中对象的三种状态
		
对象的三种状态 瞬时状态: 实体 没有id.没有与session关联 持久化状态: 特点:持久化状态对象的任何改变都会同步到数据库中 游离态[也称作托管态]: 实体 有id,没有与session关联 ...
 - Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
		
首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...
 - hibernate 中对象的3种状态总结
		
1.Hibernate把对象分文三种状态:Transient(临时状态).Persistent(持久化状态).Detached(游离状态). 1)Transient:刚刚new出来的对象,就是Tran ...
 - Hibernate之对象的三种状态
		
Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...
 - Hibernate中对象的三个状态解析
		
Hibernate 将操作的对象分为三种状态: 1. 瞬时 (Transient )/临时状态/自由状态 持久 (Persistent) 脱管 (Detached) 瞬时对象特征: 第一.不处于 Se ...
 - 关于hibernate中对象的三种状态分析
		
一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...
 - Hibernate持久化对象的三种状态深入理解
		
关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...
 - 【SSH系列】-- Hibernate持久化对象的三种状态
		
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
 
随机推荐
- C++  数组输出
			
C++中输出数组数据分两种情况:字符型数组和非字符型数组 当定义变量为字符型数组时,采用cout<<数组名; 系统会将数组当作字符串来输出,如: ]={'}; cout << ...
 - 搞清楚一道关于Integer的面试题【华为云技术分享】
			
请看题1: public class IntegerDemo { public static void main(String[] args) { Integer a = ; Integer b = ...
 - ERP会计科目表初始化
			
2019会计科目表 一.资产类 顺序号 编号 会计科目名称 会计科目适用范围 顺序号 编号 会计科目名称 会计科目适用范围 1 1001 库存现金 38 1431 周转材料 建造承包商专用 2 100 ...
 - $parsers & $formatters
			
一.理解 $parsers 和 $formatters Angular 是MVVM框架,model层数据变化了会通知view层更新,同样的view层更新了也会通知到model $parsers 和 $ ...
 - Beego 学习笔记9:Boostrap使用介绍
			
BootStrap布局 1> 下载地址: http://v3.bootcss.com/getting-started/#download 根据自己的需要,下载不同的版本.我这里使用的是1 ...
 - Mac安装Java的JDK并进行环境配置
			
一.下载JDK 1.直接进入oracle官网下载页: https://www.oracle.com/technetwork/java/javase/downloads/index.html 2.选择版 ...
 - 前端获取文件input框的美化操作
			
前面我们说了一种利用input框和js的当时获取本地文件内容的情况-详细信息参考 2017年11月8日前端用js获取本地文件的内容 以上方式获取的按钮是系统默认的显示,有时候我们需要对按钮的外观进行美 ...
 - Cheat Engine 指针
			
打开游戏 扫描时间的流程就不多说了 扫描结果 寻找基地址 右击扫描到的地址,选择什么改写了这个地址 会弹出如下窗口 不用管这个窗口,去改变一下游戏时间,出现如下图 随便打开一个,找到了数据块地址和偏移 ...
 - dm9000网卡 S3C2440
			
配置U-Boot支持dm9000网卡 原理图 # vi drivers/net/Makefile obj-$(CONFIG_DRIVER_NET_CS8900) += cs8900.o obj-$(C ...
 - git https解决免ssL和保存密码
			
1.打开windows的git bash set GIT_SSL_NO_VERIFY=true git clonegit config --global http.sslVerify false 2 ...