hibernate中merge的使用以及與update的區別
在hibernate中,merge和update是經常會用到的,兩者都有執行更新資料的作用,但是使用的情景卻有很大區別。
在資料庫記錄存在的情況下,修改某個欄位,merge會先執行select查詢語句,查到當前資料庫記錄,再執行update方法;而update會直接執行update方法。
在資料庫記錄存在的情況下,不修改欄位而直接更新時,merge只會執行select查詢語句,而update還是會執行更新語句。
在資料庫記錄不存在的情況下,merge會把獲得的資料作為一條新的記錄執行insert方法,而update則會報錯,原因時因為,查不到匹配的記錄或相關欄位,無法執行更新。
下面時網上的一些回答
update肯定會出錯,原因是程式會報持久層中已經有該物件,因為第二個session重新從資料庫中獲取了一個物件成持久態,你的update會讓那個遊離態物件也變成持久態,兩個持久態會衝突撒,然而用merge的話,它會把第一個的物件資料賦值給已經處於持久化的那個物件中,自己本身不得變為持久態
我是在做許可權與角色的級聯更新的情況下碰到的這樣的問題,許可權與角色是多對多的關係,一張中間關係表有兩者的外來鍵id
配置檔案role.hbm.xml
<set name="authoritys" table="t_roleandauthority" cascade="save-update" lazy="false">
<key>
<column name="role_id" />
</key>
<many-to-many class="org.ems.role.entity.Authority" column="authority_id"></many-to-many>
</set>
authority.hbm.xml
<set name="roles" table="t_roleandauthority" inverse="true" cascade="save-update">
<key>
<column name="authority_id" />
</key>
<many-to-many class="org.ems.role.entity.Role" column="role_id"></many-to-many>
</set>
public String modifyRole() throws Exception{
//得到角色
// Hibernate.initialize(role.getAuthoritys());
// role = new Role();
role = roleService.query(id);
System.out.println(role+"modifyRole方法");
if(rolename!=null&&rolename.trim().length()>0){
role.setName(rolename);
}
System.out.println(rolename);
//得到許可權
if(authid!=null){
for(int i=0;i<authid.length;i++){
System.out.println(authid.length);
System.out.println(authid[0]);
int auid = authid[i];
Authority authority = authorityService.query(auid);
System.out.println(authority);
role.getAuthoritys().add(authority);
}
System.out.println(authid[1]+"在這裡");
}
//更新角色
roleService.modify(role);//hibernateTemplate.merge(role); return SUCCESS;
}
相關推薦
hibernate中merge的使用以及與update的區別
在hibernate中,merge和update是經常會用到的,兩者都有執行更新資料的作用,但是使用的情景卻有很大區別。 在資料庫記錄存在的情況下,修改某個欄位,merge會先執行select查詢語句,查到當前資料庫記錄,再執行update方法;而update會直接執行up
hibernate 中的get與load的區別
Hibernate get和load區別 get和load方式是根據id取得一個記錄 下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。 1.從返回結果上對比: load方式檢索不到的話會丟擲org.hibernate.Ob
Hibernate中離線查詢與線上查詢的區別
Criteria 和 DetachedCriteria 的主要區別在於建立的形式不一樣, Criteria 是線上的,所以它是由 Hibernate Session 進行建立的;而 DetachedCriteria 是離線的,建立時無需 Session,
makefile中for的用法以及$與$$的區別
$$表示$,用來shell下引用變數,而$A或者$(A)則是Makefile的變數。 下面舉例說明: rule_1: for i in 1 2 3 4 5; do echo $(i); done 上面的程式碼不會連續列印 1 2 3 4 5 但下面的程式碼會:
Oracle的left join中on和where的區別以及與(+)的區別
資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。 在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好後
Hibernate中get()和load()的區別
factory all htm on() 被調用 容易 transacti rip con Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢:
Hibernate中get和load的區別
實體對象 alt 返回 images get .get 技術 log 查詢語句 在Hibernate中我們知道如果要從數據庫中得到一個對象,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得
<script>標簽中的 defer 與 async區別
inf src 維護 sync 腳本執行 順序 執行 使用 完成後 在html裏,使用<script>標簽對腳本進行外部或內部引用,<script>標簽包含了兩個特殊的屬性:defer與async,他們的區別如下: 1.若<script
HashMap底層原理以及與ConCurrentHashMap區別
clas put level shm segment 區別 一個 bucket link HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashc
Mybatis整理系列(01)————傳入參數方式以及#{}與${}的區別
Java實體類 erb code {} param mean ctu obj result 一、在MyBatis的select、insert、update、delete這些元素中都提到了parameterType這個屬性。MyBatis現在可以使用的parameterTyp
【hibernate】Hibernate中get()和load()的區別
etime () bsp ava fin null void 自己 IT Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢: 1
hibernate中evict()和clear()的區別
指定 立即執行 例子 obj onf 線程 當前 錯誤 AS session.evict(obj):會把指定的緩沖對象進行清除; session.clear():把緩沖區內的全部對象清除,但不包括操作中的對象。 hibernate執行的順序如下: (1)生成一個事務的對象,
hibernate中的load和get區別
package com.zking.dao.daoImpl; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transact
GNU中的 gcc 與 g++區別
GCC:GNU Compiler Collection(GUN 編譯器集合),它可以編譯C、C++、JAV、Fortran、Pascal、Object-C、Ada等語言。 gcc是GCC中的GUN C Compiler(C 編譯器) g++是GCC中的GUN C++ Compiler(C++
PHP中的 extends與implements 區別
extends 是繼承某個類 ,繼承之後可以使用父類的方法 ,也可以重寫父類的方法。 implements 是實現多個介面,介面的方法一般為空的,必須重寫才能使用. extends是繼承父類,只要那個類不是宣告為final或者那個類定義為abstract的就能繼承,php中不支援多重繼承,但
Hibernate中的事務與併發
事務的相關概念 什麼是事務 事務是邏輯上的一組操作,組成事務的各個執行單元,操作要麼全都成功,要麼全部失敗 轉賬的例子:小王給小李轉錢,扣錢,加錢,兩個操作組成了一個事務 ###事務的特性
Hibernate中load和get的區別
在Hibernate中,查詢一個物件的方法有兩種:load和get。兩者在延遲載入方面有所不同。 1、load查詢方式 通過load方法查詢物件的時候,Hibernate會使用延遲載入的方式來查詢指定的物件,也就是說,通過load方法獲取一個物件的時候,並沒有真的發出SQ
java中的equals與==的區別
這兩個東西初學java的時候就瞭解了,但那時只是大概的知道判斷數字相等就用==,String字串相等就用equals,後來也有去網上看了一下具體區別,但是,每隔一段時間理解就會變得模糊,所以在這裡記錄一下:1,對於==1)、作用於基本資料型別(也就是8大基本資料型別)變數:比
java 標準輸出與標準錯誤 out與 err 區別 用法 聯絡 java中的out與err區別 System.out和System.err的區別 System.out.println和System.err.println的區別 Java重定向S
/** * The "standard" output stream. This stream is already * open and ready to accept output data. Typically this stream * corresponds
Java中抽象類與介面區別
抽象類:抽象類是無法例項化的特殊類。所以問題是為什麼我們需要一個不能被例項化的類,抽象類只能是子類(繼承自)。換句話說,它只允許其他類繼承它,但不能例項化。優點是它為所有子類執行特定的層次結構。簡