1. 程式人生 > >Hibernate 的saveOrUpdate方法

Hibernate 的saveOrUpdate方法

hibernate提供了saveOrUpdate的方法來進行資料庫的操作。hibernate會根據物件的狀態決定是insert還是update,
其根本是通過xml檔案中unsaved-value來確定的。如果設定null,系統會根據傳入的物件的id的值判斷,如果是null,
則表示物件不存在,那麼insert;如果不是Null,則表示已經存在,那麼update.如果設定為none,那麼表示物件不存在,
會始終呼叫insert;如果設定為any,那麼表示物件始終存在,會始終呼叫update


    資料庫表主鍵的知識點:
    Generator 為每個 POJO 的例項提供唯一標識。一般情況,我們使用“native”。
class 表示採用由生成器介面net.sf.hibernate.id.IdentifierGenerator 實現的某個例項,其中包括:

   “assigned” 主鍵由外部程式負責生成,在 save() 之前指定一個。

   “hilo” 通過hi/lo 演算法實現的主鍵生成機制,需要額外的資料庫表或欄位提供高位值來源。

   “seqhilo”與hilo 類似,通過hi/lo 演算法實現的主鍵生成機制,需要資料庫中的 Sequence,
            適用於支援 Sequence 的資料庫,如Oracle。

   “increment”主鍵按數值順序遞增。此方式的實現機制為在當前應用例項中維持一個變數,以儲存著當前的最大值,
            之後每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:不能在叢集下使用。

   “identity”採用資料庫提供的主鍵生成機制。如DB2、SQL Server、MySQL 中的主鍵生成機制。

   “sequence”採用資料庫提供的 sequence 機制生成主鍵。如 Oralce 中的Sequence。

   “native”由 Hibernate 根據使用的資料庫自行判斷採用 identity、hilo、sequence 其中一種作為主鍵生成方式。

   “uuid.hex”由 Hibernate 基於128 位 UUID 演算法 生成16 進位制數值(編碼後以長度32 的字串表示)作為主鍵。

   “uuid.string”與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),不能應用在 PostgreSQL 資料庫中。

   “foreign”使用另外一個相關聯的物件的識別符號作為主鍵。

   以下舉例:
   1、指定引數的情況:
      <id name="id" unsaved-value="0">
        <generator class="sequence">
          <param name="sequence">SEQ_CHILD</param>
        </generator>
      </id>
     使用的是sequence,適合oracle資料庫;

   2、對於sql server2000中的資料庫子增欄位,在配置檔案使用下列方法實現:
      <id name="id" type="long" unsaved-value="0">
        <column name="id" sql-type="numeric" not-null="true" />
        <generator class="identity" />
      </id>
    這裡主要是:identity:代表由sql server2000資料庫自己提供子增欄位.如果要hibernate自己提供,則用increment關鍵字來實現

   3、如果表中的主鍵用字串型別:可以用hibernate自己提供的方法實現主鍵唯一:
     <id name="id" type="string" unsaved-value="null">
         <column name="cid" sql-type="char(32)" not-null="true" />
         <generator class="uuid.hex" />
     </id>
     使用的是uuid.hex: 採用128位的演算法來生成一個32位字串。最通用的一種方式。適用於所有資料庫。

   重要的知識點:
   1. 如果有部門表,有員工表,員工表中有dep_id,則表部門類和員工類是one-to-many的關係:
      可以使用: ( 在部門類department中使用下列)
      Department類:
        /** 部門的所有員工   */
       private Set staffs = new TreeSet();
    
       xml的檔案:
         <set name="staffs" >
             <key column="dep_id"/>
             <one-to-many class="hbp.sys.data.Staff"/>
         </set>
         如果是list,需要用索引<index> </index>,具體其中的含義,不是很明白.待以後研究
     
    2. 如果部門要有一個負責人,即部門表(tb_department)中有一個欄位:staff_id.
        那麼表示部門和負責人之間的關係是many-to-one的關係
        Department類:
         /** 部門負責人id */
       private Staff staff;
   
       xml 檔案
        <many-to-one name="staff" class="hbp.sys.data.Staff" column="staff_id"/>

    3. 多對多關係,一般我們是做一箇中間關聯表.我用角色和許可權做了個例子,
         Right(id,name)     Role(id,name)   中間表:tb_role_right(role_id,right_id)
         Right類中有一個Role的集合:private Set roles=new TreeSet();
         Role類中也有一個Right的集合:private Set rights=new TreeSet();
         則兩者是明顯的多對多關係.使用many-to-many來實現;
         xml檔案中
         right.hbm.xml:如下:
           <set name="roles" table="tb_role_right" cascade="all">
              <key column="right_id"/>
              <many-to-many column="role_id" class="hbp.sys.data.Role"/>
           </set>
         role.hbm.xml檔案中類似:
           <set name="rights" table="tb_role_right" cascade="all">
             <key column="role_id"/>
             <many-to-many column="right_id" class="hbp.sys.data.Right"/>
           </set>

   4. 幾個值得注意的問題:
           a)在xml?對映檔案中,寫類的名字時一定用類的全名:即:包+類名如:(hbp.sys.data.Staff),這個錯誤使我費了半天勁.:(
           b)我在寫實現基本DAO操作時,寫了
                session.delete("from Right as right where right.id="+id);
                程式死活報錯,我折騰了半天,跟蹤到底,才恍然大悟,hibernate在解析sql語句的時候把
                其中的right,當成了資料庫中的右連線("保留字"),唉,這種關鍵字,不能隨便用啊,:)

   5. hibernate中HQL語言的查詢根據你的sql的不同而返回不同的物件型別.
            如果你使用session.find(String hql)
            一般會返回一個List,如:from Staff staff;返回的是包含所有的員工物件的集合
            如你的hql為:select count(*) from Staff staff;則返回的是一個Integer物件
            如果你使用的hql為:select count(distinct staff.name),count(*) from Staff staff;則返回的是一個Object
            即Object[],需要先把他轉換成Object[],然後在取[0],[1].
            這種設計我不知道hibernate是如何處理的,感覺既好也不好.好的是可以使用一個find獲得任意查詢
            不好在於根據hql來處理返回結果,容易出錯.

相關推薦

hibernate saveOrUpdate方法和merge的區別

首先 saveOrUpdate返回void 也就是什麼都不返回 而merge會返回一個物件 其次 saveOrUpdate的做法是:將物件持久化,如果此時session快取中存在相同id的物件,則報錯;否則如果沒有id就儲存;有id的話,能找到這個id的物件就修改或者找

mybatis實現hibernate中的saveOrUpdate方法

mybatis實現saveOrUpdate 最近在做專案過程中遇到需要更新或者插入的問題,就想起hibernate有個saveOrUpdate的方法,想著mybatis是不是也有這個方法。於是上網查詢資料。該問題有兩種解決方案。 方法1:使用mybatis的標籤 <insert i

HibernatesaveOrUpdate方法

hibernate提供了saveOrUpdate的方法來進行資料庫的操作。hibernate會根據物件的狀態決定是insert還是update,其根本是通過xml檔案中unsaved-value來確定的。如果設定null,系統會根據傳入的物件的id的值判斷,如果是null,則

Hibernate session 方法總結

hibernate 方法 新增 date iter create str nat del 1 session.save(Object object); 增加 2 session.update(Object object);修改 3 session.saveOrUpda

hibernate——load()方法解決懶載入的問題

load()方法與get()方法不同,get()即使Session關閉之後,也可以使用物件,而load()方法在Session關閉之後,會出現懶載入的問題,出現的問題如下: 這個問題解決方法如下: 找到你的XXX.hbm.xml在class中加入一個屬性:lazy

關於hiberate的saveorupdate方法

saveorupdate 是根據  物件的主鍵來確實是否根據id來更新還是insert插入的, 當資料中有id(主鍵)資料 ,包括為空字串,就執行update語句  當沒 id(主鍵)資料,即id=null 就執行 insert 語句  如果id 為空字元時

hibernate-save方法詳解

Session的save()方法使一個臨時物件轉變為持久化物件。 例如以下程式碼儲存一個Customer物件:         Customer customer = new Customer();         customer.setId(new Long(9));/

Hibernate——flush()方法強制同步資料庫

@Test public void testFlush() { Session session = sf.getCurrentSession(); session.beginTrans

90---Hibernate使用方法-----------使用註解完成Hibernate對映

實體和資料庫之間存在某種對映關係,hibernate根據這種對映關係完成資料的存取。在程式中這種對映關係由對映檔案(*.hbm.xml)或者java註解(@)定義。 本文以java註解的形式總結對映關係配置。 實體類元件以及註解標籤對映關係

Hibernate save方法無法儲存的問題

最近做專案使用了hibernate,由於對這個框架不是很熟悉,遇到了很多坑。 問題描述: 執行save方法時,不報錯,中間表的內容沒有被儲存到資料庫中。 可能原因: 1.實體類沒有賦值 debug模式檢視,傳值沒有問題,排除這種原因。 2.沒有配置事務或事務沒有提交 在程式

failed to lazily initialize a collection of role: no session or session was closed (Hibernate) 解決方法(延遲載入問題)

在學著編寫OA 許可權管理時,在jsp  頁面中通過已取得的 父模組來獲取該模組的所有子模組 JSP 程式碼片段:      <c:forEach  items="${modules}" var="module">    <c:forEach ite

hibernate 常用方法介紹

一、hibetnateTemplate常用方法1、delete(Object entity) 刪除指定的持久化例項在程式中一般先用    Assert.notNull和 Assert.isTrue斷言entity是否為空 和 entity的id是否大於0若否則事務回滾。再用

Hibernate方法獲取物件後,物件呼叫set後會自動更新資料庫內容的解決辦法

例如:Object obj = dao.get(Object_2.classs,id);obj.setName("張三");這種情況下Hibernate下次提交事務的時候會把這個資料庫中對應資料更新成set後的。產生原因涉及到Hibernate設計原理,(以下這段話複製地址:

Spring不對Hibernate方法操作資料庫提供連線關閉服務

前幾天我把我之前運用Hibernate+struts1.x框架開發的web專案搬到Spring框架上,其中Hibernate和struts都配置到applicationContext.xml檔案上,通過初步測試發現所有線都已經打通了。到今天,我同樣是執行該專案,

Hibernate查詢方法總結(包括條件分頁查詢、外來鍵id查詢)

每天進步一點點,最近做專案用到了很多的hibernate的查詢方法。正好騰出時間來總結,希望對自己和他人都有幫助。 首先非常感謝施楊 's think out 和suntao1983做的總結,幫我解決的很多問題。 hibernate 的 六種基本查詢方法:分別是HQL查詢

hibernate使用方法

第一步: 導包:required下的所有包,jpa下的所有包,所連線的sql驅動包,其他日誌包(日誌包不在該框架中) 第二步: 創建於資料庫表對應的實體類。並在該實體類所在包下建立字尾名為.hbm.xml的配置檔案,該檔案為對映配置檔案 第三步:在配置檔案中配置對映關係 &

Hibernate持久化方法新增事務

  Hibernate一個方法如果 多次操作資料庫,如何新增事務管理,後臺java程式碼參考如下,注意註解@Transactional import org.springframework.tra

hibernate中session的相關方法(save,persist get,load saveOrUpdate delete evict)

        Save()與persist()方法區別   1.save()方法 使一個臨時物件變為持久化物件,為物件分配id,在flush快取時,會發送一條insert語句,在save()方法之前id設定是無效的

hibernate的save方法與sql的insert的區別

foreign try cat values key update out onf nat public boolean addDiscuss(Discuss discuss) {// Session session = HibernateSessionFactory.g

Hibernate 註解序列生成主鍵執行完select seq_t_user.nextval後不執行insert等語句導致 執行save()或update()方法無效

hiberna 不能 nal 自動提交 ext 無效 pen mave ransac 題主解決方法: 1)在DAO中獲取session的時候采用sessionFactory.getCurrentSession();不用