当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完成查找.
分享到:
相关推荐
saveOrUpdate
hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因。 假如两个实体之间有关系(例如employee表和...
本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
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提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
Hibernate 难点解析: hibernate中uuid和native的相关总结 Hibernate get与load的区别 hibernate二级缓存中list和...Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别
一个PO有三种状态: 1、未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2、已被持久化的PO,并且在Session生命周期内 此时映射数据库数据,由数据库管理生命周期 3、曾被持久化过,但现在和Session已经...
使用 Hibernate 可以使用 saveOrUpdate 方法,但是使用原生 SQL 语句时,该如何实现 save 操作呢?今天,我们将讨论 MySQL 中 save 的写法汇总。 使用 IGNORE 关键字实现数据不存在则插入,存在则无操作 在 MySQL ...
初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate.cfg.xml中的配置加载到内存,即: Configuration config = new Configuration()....
我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...
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()...
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()...
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 的基础 常用的主键生成策略 持久化对象的三种状态 一级缓存的常用操作(save/update/saveOrUpdate/delete)一对多关联映射 级联操作
在我们程序当中调用save,update,get,load,saveOrUpdate,merge,list c:游离状态(脱管状态) 对象从session作用域分离出来的时候我们叫做游离(脱管) 即:调用delete,clear,evict等方法时
Hibernate持久层方法汇总 session.load, session.find, session.iterator, session.save, session.update, session.saveorupdate
HibernateTemplate还提供了一种更灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。 HibernateTemplate的灵活访问方式是通过如下两个方法完成的: Object execute(HibernateCallback action) ...
基于泛型的通用Dao接口是指使用泛型来实现数据访问对象(DAO)的接口,主要是在使用 Hibernate 或 JPA 时使用。泛型可以使得DAO接口更灵活、更通用。 泛型Dao接口的优点: 1. 耦合性低:泛型Dao接口可以与不同的...
Hibernate中对象的三种状态: Transient(瞬态): 1.由new关键字创建 2.没有和Session进行关联的 3.数据库中没有对应的记录存在 4.操作不会影响数据库中的数据 Persistent(持久态): 1.和Session之间有关联 2.在...