溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hibernate中怎么實(shí)現(xiàn)事務(wù)對(duì)象

發(fā)布時(shí)間:2021-08-11 15:32:51 來(lái)源:億速云 閱讀:150 作者:Leah 欄目:編程語(yǔ)言

Hibernate中怎么實(shí)現(xiàn)事務(wù)對(duì)象,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

Hibernate在發(fā)送Sql把對(duì)象信息同步到數(shù)據(jù)時(shí),不是立即進(jìn)行的而是把這些要發(fā)送的Sql緩存在起來(lái),在必要的時(shí)候發(fā)送。

通過(guò)Session的setFlushMode(FlushMode flushMode)方法,來(lái)控制在什么時(shí)候清空Sql的緩沖區(qū),并把緩存的Sql語(yǔ)句發(fā)送出去。

FlushMode是一個(gè)枚舉,它有3個(gè)枚舉值。

FlushMode.AUTO,在持久化對(duì)象的信息被修改時(shí),那么就要把它同步到數(shù)據(jù)庫(kù)中,更新數(shù)據(jù)庫(kù)中隊(duì)?wèi)?yīng)的記錄,也就是在產(chǎn)生修改時(shí)就會(huì)清空緩沖區(qū)。

FlushMode.COMMIT,只有在事務(wù)提交的時(shí)候才清空緩沖區(qū)。

FlushMode.NEVER,這個(gè)值表示只有在調(diào)用了Session的flush()方法才清空緩沖區(qū)。

Hibernate的事務(wù)保證原子操作的不可分,也就是操作的同時(shí)成功或同時(shí)失敗。

Transaction tran=session.beginTranaction();

tran.commit();

tran.rollback();

以上是Hibernate的事務(wù)對(duì)象的方法,來(lái)實(shí)現(xiàn)對(duì)事務(wù)的支持。

hibernate的事務(wù)隔離級(jí)別

hibernate的事務(wù)隔離級(jí)別和JDBC中大致相同。

設(shè)置時(shí)要在hibernate.cfg.xml配置

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

1,讀未提交的數(shù)據(jù)(Read uncommitted isolation)

2,讀已提交的數(shù)據(jù)(Read committed isolation)

4,可重復(fù)讀級(jí)別(Repeatable read isolation)

8,可串行化級(jí)別(Serializable isolation)

hibernate的鎖(悲觀鎖,樂(lè)觀鎖)

悲觀鎖是由數(shù)據(jù)庫(kù)本身所實(shí)現(xiàn)的,會(huì)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行鎖定,也就是鎖行。

LockMode.UPGRADE,修改鎖,在get()方法中加上這個(gè)設(shè)置作為第三個(gè)參數(shù)。

LockMode.NONE 無(wú)鎖機(jī)制

LockMode.READ 讀取鎖

LockMode.WRITE 寫入鎖,不能在程序中直接使用

還可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法來(lái)設(shè)置鎖

樂(lè)觀鎖,也就是通過(guò)對(duì)記錄加上某些信息來(lái)解決并發(fā)訪問(wèn)的問(wèn)題。

版本檢查

要在其表中多加上一個(gè)字段表示版本信息,會(huì)在讀取時(shí)讀到這個(gè)版本號(hào),并在修改之后更新這個(gè)版本號(hào),在并發(fā)修改的時(shí),只有數(shù)據(jù)庫(kù)中記錄的版本號(hào)比要更新的才進(jìn)行更新操作,如果數(shù)據(jù)庫(kù)記錄版本號(hào)比要更新的高,就會(huì)拋出例外。

寫在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" />           < !--版本控制,指定了版本屬性的名字,和對(duì)應(yīng)表中的字段和類型-->           < property name="name" column="name"/>           < property name="phone" column="phone"/>               < /class>  < /hibernate-mapping>

關(guān)于Hibernate中怎么實(shí)現(xiàn)事務(wù)對(duì)象問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI