1.Hibernate把对象分文三种状态:Transient(临时状态)、Persistent(持久化状态)、Detached(游离状态)。

1)Transient:刚刚new出来的对象,就是Transient状态的,此时他没有OID。

*获得瞬时态对象

** User user=new User();

*瞬时态转为持久态—获得了相应的OID。

**session.save(user)

2)Persistent:有持久化标志OID,已经被纳入到session对象的管理

*获得持久化对象:

**get()/load()

*持久态转为瞬时态对象

**delete()   --比较有争议,进入特殊的状态,不太建议使用。

*持久态对象转为游离态对象

**session的close()/evict()/clear()

3) Detached:   --有持久化标志OID,但是没有被纳入到Session对象的管理

2注意:持久化对象有自动更新数据库的能力,当持久化对象的属性被改变时,调用Transaction的commit方法后,会对数据库执行update SQL操作。注意,不能改变主键的值,否则会报错。

3.三种状态的区别:

*是否在Session对象管理下,如果在,则一定是持久态,否则是临时太或者游离态。

*是否持有OID,没有OID的是临时状态,有OID的是持久化状态或者游离状态。

 

临时状态

(Transient)

持久化状态

(Persistent)

游离状态

(Detached)

是否处于Session缓存中

×

×

数据库中是否有对应记录

×

是否有OID

×

4.Hibernate缓存

在Hibernate中,缓存是很重要的,它把数据缓存在内存中,提高了数据的访问效率,存在两级缓存

1)一级缓存  ——自带的,不可卸载,以及缓存的生命周期和Session一致,一级缓存一般也称为Session级别缓存。Session接口中,存在一系列的java集合,这些集合存着一级缓存的数据,当Session对象回收时,这些集合也就回收了。当在一个Session中查询同一个对象时,是不会再次与数据库交互的。

2)二级缓存  ——默认没有开启,需要手动配置才可以可以使用。二级缓存可以在多个Session中共享数据,二级缓存称为是SessionFactory级别的缓存。

5.Hibernate采用快照模式。当数据对象被查询出来之后,不仅在一级缓存中存有一份数据,在快照中也存了一份。当对象被改变时,只改变缓存区中的数据内容,不该表快照区的数据。提交事务(执行Transaction.commit()),首先对比缓存区和快照区的内容,如果一致,则不做任何操作;如果不一致,则把缓存区中的数据更新到数据库,并把缓存区的数据也更新到快照区,形成新的快照。在对比的同时,完成对OID的验证一致性验证。

注意:只有数据变成了持久态之后,数据才有快照区副本。

6.数据库的隔离级别分为4级,分别为:Serializable(8), Repeatable(4), Read committed(2)和Read uncommitted(1)。用一解决脏读、不可重复读、虚读等隔离性问题。详情可见:https://www.cnblogs.com/fjdingsd/p/5273008.html

*Hibernate通过hibernate.connection.isolation来配置隔离性。

7绑定本地Session

1)在javaWeb中使用JDBC时,一般都是在业务层开启事务,那如何把同一个Connection传递下去,有两种方法:

*一种是通过参数传递的方式

*另一种是吧Connection绑定到ThreadLocal对象中。

2)现在在hibernate框架中,使用Session对象开启事物,所以需要传递session对象,框架提供了ThreadLocal的方式。

*需要在hibernate.cfg.xml中配置<property name=”hibernate.current_session_context_class>thread></property>

*使用SessionFactory的getCurrentSession()方法,获取当前线程的Session对象。并且该Session对象不需要手动关闭,线程结束之后会自动关闭。

*注意:要想使用getCurrentSession()方法,必须提前配置。

*注意:在使用绑定本地Session时,Transaction也是在service层开启的,而不是在DAO层。将事务维护交给service层。

hibernate 中对象的3种状态总结的更多相关文章

  1. Hibernate中对象的3种状态:瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久 态的对象也称为PO(Persistence Objec ...

  2. hibernate中对象的3种状态----瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

  3. hibernate中对象的3种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Objec ...

  4. Hibernate中对象的三种状态及相互转化

    1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:  Customer customer=new Customer(“ ...

  5. JavaWeb_(Hibernate框架)Hibernate中对象的三种状态

    对象的三种状态 瞬时状态: 实体 没有id.没有与session关联 持久化状态: 特点:持久化状态对象的任何改变都会同步到数据库中 游离态[也称作托管态]: 实体 有id,没有与session关联 ...

  6. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  7. Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】

    当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...

  8. Hibernate之对象的三种状态

    Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...

  9. Hibernate中对象的三个状态解析

    Hibernate 将操作的对象分为三种状态: 1. 瞬时 (Transient )/临时状态/自由状态 持久 (Persistent) 脱管 (Detached) 瞬时对象特征: 第一.不处于 Se ...

随机推荐

  1. Lazy<T> 提供对延迟初始化的支持

    延迟初始化  就是在第一次使用的时候在 进行类的初始化 public class Student { public Student() { this.Name = "DefaultName& ...

  2. 27款经典的CSS框架

    利用 CSS 框架,可以简化你的工作,提高工作效率.CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块.下面给你推荐了27款优秀的CSS框 ...

  3. mvn -v提示Permission denied

    解决办法: 增加权限 chmod a+x  /usr/local/apache-maven-3.5.2/bin/mvn 解释: (a:所有用户  +:增加权限   x:执行权限)

  4. c#进阶之浅析委托和事件

    何为委托 加了delegate关键字,没有方法体{}的方法模版(方法列表);委托是一种类型 public void Write() { //TODO } //加上关键字delegate,去掉方法体{} ...

  5. django fileup-load

    文件上传 使用form表单类的上传 forms.py from django import forms class UploadFileForm(forms.Form): title = forms. ...

  6. Data Base oracle常见错误及解决方案

    Data Base oracle常见错误及解决方案 一.TNS协议适配器错误: 原因: 此问题的原因都是由于监听没有配置好. 解决: 1.打开oracle工具Net Manager,删除服务及监听,重 ...

  7. FTP ftp部署遇到问题

    FTP  ftp部署遇到问题 一. 二.

  8. nowcoder(牛客网)OI测试赛2 解题报告

    qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...

  9. day0202 (%s)

    #格式化输出# % s d# name = input('请输入姓名')# age = input('请输入年龄')# height = input('请输入身高')# msg = "我叫% ...

  10. c++ 用 0x3f3f3f3f 设定最大int值的优点

    在许多算法中都要用到一个常量来表示最大值,例如:寻找一个最小数,就要先设定一个值a,如果比a小,a就等于这个数:再如,最短路径中基本的松弛操作: 0 在c++中可以用memset() 来初始化数组成最 ...