1. 程式人生 > >hibernate中merge的使用以及與update的區別

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;
 }

相關推薦

hibernatemerge的使用以及update區別

在hibernate中,merge和update是經常會用到的,兩者都有執行更新資料的作用,但是使用的情景卻有很大區別。 在資料庫記錄存在的情況下,修改某個欄位,merge會先執行select查詢語句,查到當前資料庫記錄,再執行update方法;而update會直接執行up

hibernate 的getload的區別

Hibernate get和load區別 get和load方式是根據id取得一個記錄 下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。 1.從返回結果上對比: load方式檢索不到的話會丟擲org.hibernate.Ob

Hibernate離線查詢線上查詢的區別

Criteria 和 DetachedCriteria 的主要區別在於建立的形式不一樣, Criteria 是線上的,所以它是由 Hibernate Session 進行建立的;而 DetachedCriteria 是離線的,建立時無需 Session,

makefilefor的用法以及$$$的區別

$$表示$,用來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 joinon和where的區別以及(+)的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。       在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好後

Hibernateget()和load()的區別

factory all htm on() 被調用 容易 transacti rip con Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢:

Hibernateget和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

hibernateHibernateget()和load()的區別

etime () bsp ava fin null void 自己 IT Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢: 1

hibernateevict()和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的 extendsimplements 區別

extends 是繼承某個類 ,繼承之後可以使用父類的方法 ,也可以重寫父類的方法。 implements 是實現多個介面,介面的方法一般為空的,必須重寫才能使用. extends是繼承父類,只要那個類不是宣告為final或者那個類定義為abstract的就能繼承,php中不支援多重繼承,但

Hibernate的事務併發

事務的相關概念 什麼是事務 事務是邏輯上的一組操作,組成事務的各個執行單元,操作要麼全都成功,要麼全部失敗 轉賬的例子:小王給小李轉錢,扣錢,加錢,兩個操作組成了一個事務 ###事務的特性

Hibernateload和get的區別

在Hibernate中,查詢一個物件的方法有兩種:load和get。兩者在延遲載入方面有所不同。 1、load查詢方式 通過load方法查詢物件的時候,Hibernate會使用延遲載入的方式來查詢指定的物件,也就是說,通過load方法獲取一個物件的時候,並沒有真的發出SQ

java的equals==的區別

這兩個東西初學java的時候就瞭解了,但那時只是大概的知道判斷數字相等就用==,String字串相等就用equals,後來也有去網上看了一下具體區別,但是,每隔一段時間理解就會變得模糊,所以在這裡記錄一下:1,對於==1)、作用於基本資料型別(也就是8大基本資料型別)變數:比

java 標準輸出標準錯誤 out err 區別 用法 聯絡 java的outerr區別 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抽象類介面區別

抽象類:抽象類是無法例項化的特殊類。所以問題是為什麼我們需要一個不能被例項化的類,抽象類只能是子類(繼承自)。換句話說,它只允許其他類繼承它,但不能例項化。優點是它為所有子類執行特定的層次結構。簡