Hibernate中update()和merge()的區別

初學hibernate時,對於session中的update()和merge()兩個方法,很容易搞混,以爲兩種都能用,有時候,又以爲不知道該用哪種。數據庫

實際上,這兩個方法,是有很大區別的session

首先,對於一個處於detatch狀態的實體對象來講,要將其中的修改,合併到數據庫中,有兩種方法,一種方式,是調用update(),另外一種方式是調用merge()ide

當調用update()時,首先要確保目標session中,不包含一樣id的實體對象的引用,若是有的話,會拋出異常,完成update()方法後,這個實體對象從detatch狀態,轉換爲persistent狀態,在session提交前,後續對其的修改,都會被合併到數據庫中。hibernate

當調用merge()對象時,無需考慮session中是否已經包含一樣id的實體對象,若是session中沒有一樣id的實體對象,hibernate會經過select語句,從數據庫中查詢出對應對象,若是數據庫中沒有對應對象,就新建一個。同時,完成merge()操做後,會返回數據庫中對應的persistent狀態對象,而原有的,做爲參數傳入的實體對象,仍然是detatch狀態,後續代碼對其的修改,沒法合併到數據庫中。若是session中存在相同持久化標識(identifier)的實例,用用戶給出的對象覆蓋session已有的持久實例(把處於detatch的po對象A的屬性copy到session當中處於持久態的po的屬性中,執行完成後原來是持久狀態仍是持久態,而咱們提供的A仍是原來狀態)。對象

相關文章
相關標籤/搜索