Hibernate中怎么实现事务对象,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
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" />
例:
public class User implements Serializable{ private int id; private String name; private String phone; private int version;//记录版本的属性 public int getId(){ return id; } public void setId(int id){ this.id = id; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getPhone(){ return phone; } public void setPhone(String phone){ this.phone = phone; } public int getVersion(){ return version; } public void setVersion(int version){ this.version = version; } }
User类的User.hbm.xml文件
< hibernate-mapping package="alan.hbn.concur.version" auto-import="false"> < class name="User" table="user_version"> < id name="id" column="id" type="integer" unsaved-value="0"> < generator class="native"/> < /id> < version name="version" column="version" type="integer" /> < !--版本控制,指定了版本属性的名字,和对应表中的字段和类型--> < property name="name" column="name"/> < property name="phone" column="phone"/> < /class> < /hibernate-mapping>
关于Hibernate中怎么实现事务对象问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。