`

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 的saveOrUpdate

    saveOrUpdate

    save, saveOrUpdate, persist, merge, update 区别.docx

    hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因。 假如两个实体之间有关系(例如employee表和...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通Hibernate:对象持久化技术第二版part3

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    Hibernate入门文档

    Hibernate 难点解析: hibernate中uuid和native的相关总结 Hibernate get与load的区别 hibernate二级缓存中list和...Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别

    Hibernate save() saveorupdate()的用法第1/2页

    一个PO有三种状态: 1、未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2、已被持久化的PO,并且在Session生命周期内 此时映射数据库数据,由数据库管理生命周期 3、曾被持久化过,但现在和Session已经...

    mysql 原生语句中save 的写法汇总.docx

    使用 Hibernate 可以使用 saveOrUpdate 方法,但是使用原生 SQL 语句时,该如何实现 save 操作呢?今天,我们将讨论 MySQL 中 save 的写法汇总。 使用 IGNORE 关键字实现数据不存在则插入,存在则无操作 在 MySQL ...

    hibernate操作数据库笔记

    初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate.cfg.xml中的配置加载到内存,即: Configuration config = new Configuration()....

    Hibernate的Session的javadoc

    我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    hibernate基础 二 关联映射 级联操作

    hibernate 的基础 常用的主键生成策略 持久化对象的三种状态 一级缓存的常用操作(save/update/saveOrUpdate/delete)一对多关联映射 级联操作

    java语言hebernate代码

    在我们程序当中调用save,update,get,load,saveOrUpdate,merge,list c:游离状态(脱管状态) 对象从session作用域分离出来的时候我们叫做游离(脱管) 即:调用delete,clear,evict等方法时

    Hibernate持久层方法汇总

    Hibernate持久层方法汇总 session.load, session.find, session.iterator, session.save, session.update, session.saveorupdate

    第24次课-1 Spring与Hibernate的整合

    HibernateTemplate还提供了一种更灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。 HibernateTemplate的灵活访问方式是通过如下两个方法完成的: Object execute(HibernateCallback action) ...

    基于泛型的通用Dao接口和hibernate的实现

    基于泛型的通用Dao接口是指使用泛型来实现数据访问对象(DAO)的接口,主要是在使用 Hibernate 或 JPA 时使用。泛型可以使得DAO接口更灵活、更通用。 泛型Dao接口的优点: 1. 耦合性低:泛型Dao接口可以与不同的...

    jdbc基础和参考

    Hibernate中对象的三种状态: Transient(瞬态): 1.由new关键字创建 2.没有和Session进行关联的 3.数据库中没有对应的记录存在 4.操作不会影响数据库中的数据 Persistent(持久态): 1.和Session之间有关联 2.在...

Global site tag (gtag.js) - Google Analytics