首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

NHibernate實戰(5):CRUD 核心操作與對象狀態初探

     編輯:關於.NET

前言

工作單元模式下,操作需顯式提交或回滾。本文構建 DAL 層 CRUD 方法,對比 LINQ to SQL 的 SubmitChanges,闡述 NHibernate 的 Flush 機制與三大對象狀態。

操作數據概述

NHibernate 中 ISession 為工作單元,修改需 Flush() 同步到資料庫,事務提交時自動觸發。

四大核心操作實現

1. 新建對象

public int CreateCustomer(Customer customer)
{
    int newId = (int)_session.Save(customer);
    _session.Flush();
    return newId;
}

測試:新建 Customer → Save 返回 ID → 再次查詢驗證存在。

2. 刪除對象

public void DeleteCustomer(Customer customer)
{
    _session.Delete(customer);
    _session.Flush();
}

語義理解:Delete() 將持久化實例轉為臨時實例,應用程序仍持有引用但資料庫記錄已移除。支援 HQL 批量刪除,順序不影響外鍵約束。

3. 更新對象

public void UpdateCustomer(Customer customer)
{
    _session.Update(customer);
    _session.Flush();
}

測試:查詢 ID=1 → 修改 Firstname → Update → 再次查詢驗證修改生效。

4. 保存或更新

public void SaveOrUpdateCustomer(IList<Customer> customers)
{
    foreach (var c in customers)
        _session.SaveOrUpdate(c);
    _session.Flush();
}

智能判斷邏輯:

  1. 檢查對象是否已在 Session 中
  2. 否 → Save() 持久化新對象
  3. 是 → 檢查是否髒數據(屬性變更)
  4. 髒 → Update() 同步修改
  5. 否 → 無操作

測試場景:混合列表包含「查詢修改的現有對象」與「新建對象」,單次調用完成增更新合一。

對象三大狀態核心概念

狀態英文特徵典型場景
瞬時態Transient無標識符、未關聯 Session、資料庫無記錄new Customer()
持久態Persistent有標識符、關聯 Session、資料庫有記錄、變更自動同步session.Load/Get/Save 後
游離態Detached有標識符、未關聯 Session(Session 關閉/清理/驅逐)跨請求傳遞、Web 應用

狀態轉換圖

Transient --Save()--> Persistent --Flush/Commit--> Database
    ^                        |
    |                        | Delete()
    |                        v
    +---- Evict/Close ---- Detached --Update/SaveOrUpdate()--> Persistent

結語

掌握 Save/Update/Delete/SaveOrUpdate 與 Flush 配合,理解三大狀態轉換,是驾驭 NHibernate 的前提。下篇將介紹事務管理將操作納入 ACID 保護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved