Hibernate的事务:事务对象的方法
创始人
2024-04-08 16:31:48
0

Hibernate在发送Sql把对象信息同步到数据时,不是立即进行的而是把这些要发送的Sql缓存在起来,在必要的时候发送。

通过Session的setFlushMode(FlushMode flushMode)方法,来控制在什么时候清空Sql的缓冲区,并把缓存的Sql语句发送出去。

FlushMode是一个枚举,它有3个枚举值。

FlushMode.AUTO,在持久化对象的信息被修改时,那么就要把它同步到数据库中,更新数据库中队应的记录,也就是在产生修改时就会清空缓冲区。

FlushMode.COMMIT,只有在事务提交的时候才清空缓冲区。

FlushMode.NEVER,这个值表示只有在调用了Session的flush()方法才清空缓冲区。

Hibernate的事务保证原子操作的不可分,也就是操作的同时成功或同时失败。

Transaction tran=session.beginTranaction();

tran.commit();

tran.rollback();

以上是Hibernate的事务对象的方法,来实现对事务的支持。

hibernate的事务隔离级别

hibernate的事务隔离级别和JDBC中大致相同。

设置时要在hibernate.cfg.xml配置

< property name="hibernate.connection.isolation">4< /property>

1,读未提交的数据(Read uncommitted isolation)

2,读已提交的数据(Read committed isolation)

4,可重复读级别(Repeatable read isolation)

8,可串行化级别(Serializable isolation)

hibernate的锁(悲观锁,乐观锁)

悲观锁是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行。

LockMode.UPGRADE,修改锁,在get()方法中加上这个设置作为第三个参数。

LockMode.NONE 无锁机制

LockMode.READ 读取锁

LockMode.WRITE 写入锁,不能在程序中直接使用

还可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法来设置锁

乐观锁,也就是通过对记录加上某些信息来解决并发访问的问题。

版本检查

要在其表中多加上一个字段表示版本信息,会在读取时读到这个版本号,并在修改之后更新这个版本号,在并发修改的时,只有数据库中记录的版本号比要更新的才进行更新操作,如果数据库记录版本号比要更新的高,就会抛出例外。

写在Xxxxx.hbm.xml中

< version name="version" column="version" type="integer" />

例:

  1. public class User implements Serializable{  
  2.  
  3.     private int id;  
  4.  
  5.     private String name;  
  6.  
  7.     private String phone;  
  8.  
  9.     private int version;//记录版本的属性  
  10.  
  11.     public int getId(){  
  12.  
  13.         return id;  
  14.  
  15.     }  
  16.  
  17.  
  18.  
  19.     public void setId(int id){  
  20.  
  21.         this.id = id;  
  22.  
  23.     }  
  24.  
  25.  
  26.  
  27.     public String getName(){  
  28.  
  29.         return name;  
  30.  
  31.     }  
  32.  
  33.  
  34.  
  35.     public void setName(String name){  
  36.  
  37.         this.name = name;  
  38.  
  39.     }  
  40.  
  41.  
  42.  
  43.     public String getPhone(){  
  44.  
  45.         return phone;  
  46.  
  47.     }  
  48.  
  49.  
  50.  
  51.     public void setPhone(String phone){  
  52.  
  53.         this.phone = phone;  
  54.  
  55.     }  
  56.  
  57.  
  58.  
  59.     public int getVersion(){  
  60.  
  61.         return version;  
  62.  
  63.     }  
  64.  
  65.  
  66.  
  67.     public void setVersion(int version){  
  68.  
  69.         this.version = version;  
  70.  
  71.     }     
  72.  
  73.       
  74.  
  75. }  

User类的User.hbm.xml文件

  1. < hibernate-mapping package="alan.hbn.concur.version" auto-import="false"> 
  2.  
  3.      < class name="User" table="user_version"> 
  4.  
  5.          < id name="id" column="id" type="integer" unsaved-value="0"> 
  6.  
  7.               < generator class="native"/> 
  8.  
  9.          < /id> 
  10.  
  11.          < version name="version" column="version" type="integer" /> 
  12.  
  13.          < !--版本控制,指定了版本属性的名字,和对应表中的字段和类型--> 
  14.  
  15.          < property name="name" column="name"/> 
  16.  
  17.          < property name="phone" column="phone"/>          
  18.  
  19.     < /class> 
  20.  
  21. < /hibernate-mapping> 

【编辑推荐】

  1. Hibernate缓存简介及分类
  2. Hibernate中generator属性的意义
  3. hibernate Key Generator 主键生成方式
  4. Hibernate的主键生成机制
  5. hibernate的Query cache 
     

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...