Hibernate對單條記錄的增刪改查

菜雞03號發表於2016-08-29

(hibernate學習筆記系列來自於 “瘋狂Java” Hibernate視訊學習)

  • 儲存使用者
    • session.save(person);
    • session.persist(person);
  • 查詢使用者
    • load(Class theClass,Serializable id)
    • get(Class theClass,Serializable id)
  • 修改使用者
    • session.update(person)
    • session.merger(person);
  • 儲存或修改使用者
    • session.saveOrUpdate(person)
    • merge(person)
  • 刪除使用者
    • session.delete(person)

增加記錄有兩種方法,save()和persist();
而persist:堅持; 存留; 固執; 繼續存在,所以persist()的名字更加顯而易見
save()會返回一個id
而persist()沒有返回值
**如果新增的物件指定了id欄位,persist會出現異常,而save會忽略id欄位的設定**

根據id查詢一條記錄,方法有兩種load()和get()方法
  • load(Class theClass,Serializable id)

    theClass指待查詢的持久化類,Serializable id表示表中的第幾條記錄

  • get(Class theClass,Serializable id)

    get立即查詢,而load是延遲查詢(用的時候查詢)
    load返回的是一個持久化類的代理,等到使用例項的除id之外的欄位才查詢資料庫
    load方法查詢id對應的記錄不存在時會出現ObjectNotFoundException異常
    get方法查詢的記錄不存在的時候返回記錄為null
    在*.hbm.xml檔案裡可以使用class標籤的lazy屬性設定load方法是否立即查詢,預設為true,代表延遲查詢


方法為update(),merge(),saveOrUpdate()

首先需要了解hibernate中物件存在的三種狀態

hibernate中物件的狀態.png

update()和merge(),saveOrUpdate()都有兩種方式
  • 先查詢出一條記錄,然後在執行update進行更新資料記錄

    改的時候需要事務,所以要用session建立一個transaction物件。
    修改的時刻在session關閉的時候
    
  • 自己new一個物件,然後設定所要更新的欄位,其他的欄位也要設定為原來的值(否則會變成空),然後設定id的值,這個id必須是資料庫中存在的id,否則會出現異常

    在這裡我們也可以看出資料庫中唯一標識欄位應該是一個物件,而不是基本型別,因為基本型別會有預設的值,這樣的話如果忘了setId(id),那麼就會修改掉id=0的記錄
    
  • 利用session.merge(Object o)
    merge()方法會返回o所對應的一個持久化物件,如果o本身就是一個持久化物件,則返回值與o指向的是同一個物件;如果o是一個臨時狀態(new出來的一個物件),則返回值是一個持久化物件,而與o是不同的。
    對於merge
    如果給定的id不存在就是新增,即使id不存在;
    如果id存在,就是修改。

  • 利用saveOrUpdate()
    根據傳遞的物件有沒有ID來進行新增或修改操作。
    有id就是修改
    沒有id就是新增
    如果傳遞的物件的id在資料庫裡不存在,則會出錯

方法:delete()
用get或者load得到要刪除的記錄,然後呼叫delete(Object o);
或者new一個物件,設定id,然後呼叫delete(),如果id不存在丟擲異常

以上的操作都是針對一條記錄的增刪改查

相關文章