第十二节:Hibernate 事务隔离,对象状态

  • 瞬时态:当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被JVM的垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save()、saveOrUpdate()、persist()、merge()方法把瞬时态对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久态对象。
  • 持久态:持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久态对象进行delete操作后,数据库中对应的记录将被删除,那么持久态对象与数据库记录不再存在对应关系,持久态对象变成移除态(可以视为瞬时态)。持久态对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。
  • 游离态:当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和与数据库对应记录一致的标识值,但是因为对象已经从会话中清除掉,对象不在持久化管理之内,所以处于游离态(也叫脱管态)。游离态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。

Hibernate事务隔离级别:


隔离级别


脏读 (Dirty Read)


不可重复读(NonRepeatable Read)


幻读 (Phantom Read)


读操作未提交 (Read uncommitted)


可能


可能


可能


读操作已提交 (Read commited)


不可能


可能


可能


可重复读 (Repeatable read)


不可能


不可能


可能


可串行化 (Serializable)


不可能


不可能


不可能

设置隔离级别:

<property name=”hibernate.connection.isolation”>4</property> //可填1,2,4(不可重复读),8

在以下的情况下,Hibernate会调用flush():

(1)    事务提交时,如果flush模式不为FlushMode.NEVER, commit()将调用flush().

(2)    在某些查询语句之前(此查询语句已经改变了数据库状态,所以需要调用flush()以同步数据,使查出来的数据是经过更改的)

(3)    当程序强制调用session.flush时。

在一个事务中调用一个select 查询,如果此查询之前已经有某个update语句做了数据修改(注意此update语句并没有真正执行),则首先会调用flush(),使update对数据库操作成功,接着才返回查询数据。

FlushMode有以下几种:

(1)       FlushMode.AUTO: 数据有更改,则在查询前更新此改动,以保证数据同步.

(2)       FlushMode.COMMIT:  在事务结束之前刷新session

(3)       FlushMode.NEVER: 仅在明确调用flush()时才对数据库进行同步.

在Hibernate中使用JDBC事务:

Hibernate.transaction.factory_class=net.sf.hibernate.transaction.JDBCTransactionFactory

使用JTA 事务:

在一个具有多个数据库的系统中,可能一个程序将会调用几个数据库中的数据,需要一种分布式事务,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction.

Hibernate中对数据的锁定:

如果要在事务中使用悲观锁,则可以像下面这样写:

Transaction tx=session.beginTransaction();

//取得持久化User对象,并使用LockMode.UPGRADE模式锁定对象

User user=(User)session.get(User.class,LockMode.UPGRADE);

user.setName(“newName”);  //更改对象属性,注意并不需要使用session.save(user)

tx.commit();

这样的话,Hibernate会使用select …… for update 语句载入User类,并且锁住了这个对象在数据库中的列,直到事务完成(commit()以后)。

Hibernate 可以利用Query或者Criteria的setLockMode()方法来设定要锁定的表或列(Row)及其锁定模式。可设定的模式有两个:

(1)       LockMod.UPGRADE

(2)       LockMode.UPDGRADE_NOWAIT:

原文地址:https://www.cnblogs.com/mxxblog/p/12588389.html

时间: 2024-11-08 21:32:53

第十二节:Hibernate 事务隔离,对象状态的相关文章

Hibernate(四)之对象状态及一级缓存

一.Hibernate中的对象状态 1.1.瞬时态(临时态) 没有与Hibernate产生关联 与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应) 获得:一般都只直接创建(new) 瞬时态 转换 持久态 一般操作:save方法.saveOrUpdate 瞬时态 转换 脱管态 一般操作:通过setId方法设置数据 1.2.持久态 Hibernate有关联 对象有id 获得: 查询操作:get.loat.createQuery.createCriteria 等 获得都是持久态[] 执

Hibernate 几种对象状态

Hibernate 中四种对象状态 临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中.处于临时状态 的Java 对象被称为临时对象. 持久化状态(persistent):已经被持久化,并且加入到Session 的缓存中.处于持久化状态的Java 对象被称为 持久化对象. 删除状态(removed):不再处于Session 的缓存中,并且Session 已经计划将其从数据库中删除.处于删除状 态的Java 对象被称为删除对象. 游离状态(d

【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示

一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化类需要提供oid.与数据库中的主键列对应 5.不要用final修饰class 主键类型 自然主键(少见) 表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用. 代理主键(常见) 表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键

hibernate缓存机制和事务隔离机制

一级缓存( Session缓存) }         一级缓存的管理 ?          应用程序调用Session的save().update().saveOrUpdate().get()或load(),以及调用查询接口的 list().iterate() 时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中. ?          可以通过close/clear/evict清空缓存 }         作用 因为Session的生命期往往很短,

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati

hibernate学习(5)——对象状态与一级缓存

1.对象状态 1.1   状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联,与数据库中的记录没有产生关联. OID特点:没有值 持久态:persistent,session缓存对象,数据库最终会有记录.(事务没有提交)与hibernate关联,对象有id OID特点:有值 脱管态:detached,session没有缓存对象,数据库有记录.没有与hibernate关联,对

Hibernate对象状态

对象状态 瞬时(transient) 自己new出来的对象,数据库没有记录与之对应,与session也没有关联 持久(persistent) 数据库中有记录与之对应,当前与session有关联,相关的session未关闭,事务未提交 持久对象如果发生改变,Hibernate能够检测到,事务提交的时候会将改变后的数据提交给数据库 脱管(detached,也有翻译成游离) 数据库有记录与之对应,但没有与session关联,托管对象的改变Hibernate无法检测到 使用场景 对瞬时对象进行保存报错

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

瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交: 持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到). (当对象save后,会将数据持久化,这时obj.set()后再提交事务hibernate会检测到数据的修改. 而如果在save这个对象之前(即

Hibernate 入门 04 - Hibernate中Java对象的三种状态

目录:(后续不断更新...) Hibernate 入门 01 - 框架技术 (介绍Hibernate框架的发展由来) Hibernate 入门 02 - Hibernate介绍及其环境搭建 Hibernate 入门 03 - 使用Hibernate完成持久化操作 Hibernate 入门 04 - Hibernate中Java对象的三种状态 ▁▃▅ Hibernate中Java对象的三种状态▅▃▁ 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久