1. 程式人生 > >NHibernate 對映基礎(第三篇) 簡單對映、聯合主鍵

NHibernate 對映基礎(第三篇) 簡單對映、聯合主鍵

 NHibernate完全靠配置檔案獲取其所需的一切資訊,其中對映檔案,是其獲取資料庫與C#程式關係的所有資訊來源。

一、簡單對映

  先來看一張表:

  

  對映檔案Product.hbm.xml:

?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.ProductModel, Model" table="Product">
<id name="ProductId" column="ProductId" type="Int32">
<generator class="native"/>
</id>
<property name="ProductName" column="ProductName" type="String"/>
<property name="ProductPrice" column="ProductPrice" type="float"/>
<property name="ProductDiscount" column="ProductDiscount" type="float"/>
<!--這個屬性沒有與之對應的列,其列為ProductPrice * ProductDiscount相乘得來-->
<property name="ActualPrice" formula="ProductPrice * ProductDiscount" type="float"/>
</class>
</hibernate-mapping>

  PersonModel.cs:

amespace Model
{
public class ProductModel
{
public virtual int ProductId { get; set; }
public virtual string ProductName { get; set; }
public virtual float ProductPrice { get; set; }
public virtual float ProductDiscount { get; set; }
public virtual float ActualPrice { get; set; }  //資料庫裡並沒有這個欄位
}
}

  在這裡要注意下最後一個欄位,資料庫裡並沒有這個欄位。

  ProductDao.cs:

ublic class ProductDao
{
public ProductModel GetProduct(int Id)
{
ISession NSession = NHibernateHelper.GetSession();
return NSession.Get<ProductModel>(Id);
}
}

  Program.cs:

        static void Main(string[] args)
        {
            ProductDao dao = new ProductDao();
            ProductModel pm = dao.GetProduct(1);
            Console.WriteLine(pm.ProductId + " " + pm.ProductName + " " + pm.ProductPrice + " " + pm.ProductDiscount + " " + pm.ActualPrice);
        }

  顯示結果如下:

  

  你可能奇怪,為什麼最後一個欄位資料庫沒有,但是為什麼也能夠查詢出結果呢?答案在於配置裡面的

  formula="ProductPrice * ProductDiscount"

  這個屬性配置之後,允許某欄位的值從其他欄位計算獲得。

  我們來看看生成的SQL程式碼

xec sp_executesql N'SELECT productmod0_.ProductId as ProductId4_0_, productmod0_.ProductName as ProductN2_4_0_, productmod0_.ProductPrice as ProductP3_4_0_,
productmod0_.ProductDiscount as ProductD4_4_0_, productmod0_.ProductPrice * productmod0_.ProductDiscount as formula0_0_ FROM Product productmod0_ WHERE [email protected]',N'@p0
int',@p0=1
--以上SQL程式碼相當於
SELECT ProductId,ProductName,ProductPrice,ProductDiscount, ProductPrice * ProductDiscount AS formula FROM Product

  其實,這是NHibernate根據我們的配置,幫我們生成了SQL語句,計算出另外的欄位並繫結的對應的屬性當中。

  下面我們開始來不斷更改,以瞭解更多的NHibernate配置的作用。

  我們將Product.hbm.xml的第一行加上下面這一句:

  select-before-update="true"
 <class name="Model.ProductModel, Model" table="Product" select-before-update="true">

  然後PersonDao.cs增加此方法:

        public void UpdateProduct(ProductModel product)
        {
            ISession NSession = NHibernateHelper.GetSession();
            NSession.Update(product);
            NSession.Flush();
        }

  用於更新一個Product。

  Program.cs:

        static void Main(string[] args)
        {
            ProductDao dao = new ProductDao();
            ProductModel pm = dao.GetProduct(1);
            dao.UpdateProduct(pm);
        }

  對於此操作,SQL Server Profiler檢測到執行了如下語句:

xec sp_executesql N'SELECT productmod0_.ProductId as ProductId4_0_, productmod0_.ProductName as ProductN2_4_0_, productmod0_.ProductPrice as ProductP3_4_0_,
productmod0_.ProductDiscount as ProductD4_4_0_, productmod0_.ProductPrice * productmod0_.ProductDiscount as formula0_0_ FROM Product productmod0_ WHERE [email protected]',N'@p0
int',@p0=1
--相當於如下語句
SELECT ProductId,ProductName,ProductPrice,ProductDiscount FROM Product WHERE ProductId = 1

  而當我們去掉

  select-before-update  
  或者將其值設定為flase時,就會直接執行UPDATE語句。select-before-update的作用在於,控制在UPDATE語句之前是否先執行一次查詢,以檢查物件是否有變化,當資料發生變化之後才UPDATE,否則不UPDATE。

二、聯合主鍵

  新建一張表如下:

     

   以上3列資料都是NVarchar()型別。

  下面來看配置對映檔案:

  Composite.hbm.xml

?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.CompositeModel, Model" table="Composite">
<composite-id name="Pk" class="Model.PKModel, Model">  //name為主實體類的屬性名
<key-property name="Id1" type="String" column="Id1"/>
<key-property name="Id2" type="String" column="Id2"/>
</composite-id>
<property name="Name" column="Name" type="String"/>
</class>
</hibernate-mapping>

  CompositeModel.cs

    public class CompositeModel
    {
        public virtual PKModel Pk { get; set; }
        public virtual string Name { get; set; }
    }

  PKModel.cs

ublic class PKModel
{
public virtual string Id1 { get; set; }
public virtual string Id2 { get; set; }

/// <summary>
/// 判斷兩個物件是否相同,這個方法需要重寫
/// </summary>
/// <param name="obj">進行比較的物件</param>
/// <returns>真true或假false</returns>
public override bool Equals(object obj)
{
if (obj is PKModel)
{
PKModel pk = obj as PKModel;
if (this.Id1 == pk.Id1 && this.Id2 == pk.Id2)
{
return true;
}
}
return false;
}

public override int GetHashCode()
{
return base.GetHashCode();
}
}

   操作:

lass Program
{
static void Main(string[] args)
{
ISessionFactory _sessionFactory = new Configuration().Configure().BuildSessionFactory();
using(ISession NSession = _sessionFactory.OpenSession())
{
IList<CompositeModel> ListComposite = NSession.Query<CompositeModel>().ToList();
foreach (var c in ListComposite)
{
Console.WriteLine(c.Name);
}

//查詢單條
PKModel pk = new PKModel();
pk.Id1 = "01";
pk.Id2 = "1";
CompositeModel m = NSession.Get<CompositeModel>(pk);
Console.WriteLine(m.Name);
}
Console.ReadKey();
}
}

  輸出:

   

   要點:1、聯合主鍵提取出來作為一個類

      2、要重寫兩個方法

相關推薦

NHibernate 對映基礎() 簡單對映聯合

 NHibernate完全靠配置檔案獲取其所需的一切資訊,其中對映檔案,是其獲取資料庫與C#程式關係的所有資訊來源。 一、簡單對映   先來看一張表:      對映檔案Product.hbm.xml: ?xml version="1.0" encoding="

Python基礎:函數

turn 說明 代碼 名稱 維護 span 大小寫 div 邏輯 一、Python函數介紹 1.函數的作用 規範代碼使代碼變得邏輯性更強 提高可讀性,方便管理,降低維護成本,以及降低代碼冗余 函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 2.函

python 基礎

nic 輸出 歐洲 模板 部分 不變 準備 alpha numeric 一. 編碼1. 最早的計算機編碼是ASCII. 美國人創建的. 包含了英文字母(大寫字母, 小寫字母). 數字, 標點等特殊字符!@#$%128個碼位 2**7 在此基礎上加了一位 2**88位. 1個

html5基礎,圖片標籤。

1.img顯示圖片的標籤 <img  src="" alt="" width="" height=""> 2.必選屬性 (1).src。圖片顯示內容的路徑 絕對路徑 :帶有網路協議的網址 <img src="https://www.baidu.co

【SSH三大框架】Hibernate基礎十三:lazyconstrainedfetch個屬性的作用和使用方法

這三個屬性,個人感覺對於懶載入是很重要的,所以又重新開了一篇部落格來寫下這三個屬性的作用和使用方法 一、lazy屬性: lazy概念:只有真正使用該物件時,才會建立。對於hibernate而言,真正使用時才會發出SQL語句 1、在集合中定義: <set name

用HTML+PHP寫一個留言板來進行XSS測試&學習 (簡單的過濾標籤功能實現&繞過)

這次我們要給前一篇文章寫的簡易“入庫”留言板新增一個功能,實現初級的過濾 留言板程式碼請看:http://blog.csdn.net/qq_38219257/article/details/69808

【SSH三大框架】Struts2基礎:配置Action以及呼叫Action的種方式

一、struts.xml中的包和名稱空間 1、Struts2不支援為單獨的Action設定名稱空間,而是通過為包指定namespace屬性來為包下面的所有Action指定共同的名稱空間。 如果在配置<package>的時候沒有指定namespace屬性,則該包下

CSS3基礎(佈局相關,媒體查詢,使用者介面)

1.多列布局 1.1 多列布局——Columns 為了能在Web頁面中方便實現類似報紙、雜誌那種多列排版的佈局,W3C特意給CSS3增加了一個多列布局模組(CSS Multi C

Django Restful Framework【】認證權限限制訪問頻率

authent per ted inf png ip限制 users -a python 一、認證 認證請求頭 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views

前端之路——:列表表單提交按鈕html佈局css的display,製造第一個表單提交案例

第三課了,今天知識點至關重要。 網頁常用的表單提交!!! 就這樣羅列下第三課的知識點吧,不搞水印圖片了。 1.有序列表:語法(<ol><li></li></ol>),<ol>標籤能讓瀏覽器預設帶出排序,教為少用

Hibernate學習筆記()----ID生成策略聯合

一、ID生成策略(參考hibernate_0400_ID) 1)xml生成id使用generator屬性          <idname="id" >          <generatorclass="native"></generator

MongoDB基礎教程系列-- MongoDB 對映與限制記錄

https://www.cnblogs.com/liruihuan/p/6670289.html 上一篇提到的 find() 的方法,細心的夥伴會發現查詢的結果都是顯示了集合中全部的欄位,實際應用中,顯然是不夠用的。那麼有沒有辦法指定特定的欄位顯示出文件呢?答案是肯定的,MongoDB 中用對映

linux設備驅動:寫一個簡單的字符設備驅動

提示 copy flags 驅動程序 相關 clas open ugo param 在linux設備驅動第一篇:設備驅動程序簡介中簡單介紹了字符驅動,本篇簡單介紹如何寫一個簡單的字符設備驅動。本篇借鑒LDD中的源碼,實現一個與硬件設備無關的字符設備驅動,僅僅操

Python之路【】:Python基礎之雜貨鋪

對齊 表示 microsoft 小數點 true per 字符串 orm bsp 字符串格式化 Python的字符串格式化有兩種方式:百分號方式、format方式 百分號的方式相對來說比較老,而format方式則是比較先進的方式,企圖替換古老的方式,目前兩者並存。 1

R實戰 :數據處理(基礎

計算 edi 字符數 定義函數 空間 數值 sqrt 字符類 ceil 數據結構用於存儲數據,不同的數據結構對應不同的操作方法,對應不同的分析目的,應選擇合適的數據結構。在處理數據時,為了便於檢查數據對象,可以通過函數attributes(x)來查看數據對象的屬性,str(

基礎數論

<前言> 整除 算術基本定理(唯一分解定理) 最大公約數和最小公倍數(gcd和lcm) 同餘 威爾遜定理和費馬小定理 尤拉函式以及求解 尤拉定理 <更新提示> <第一次更新>這次基本上是最後一次數論更新啦,三篇

2 stream -- 對映(map or flatmap)

/** * 對映: * 一個非常常見的資料處理套路就是從某些物件中選擇資訊。比如在SQL裡,你可以從表中選 * 擇一列。Stream API也通過map和flatMap方法提供了類似的工具。 */ public class Demo2 { public static void mai

MybatisPlus之如何使用行程式碼完成(複雜條件)分頁(在此係列第二基礎上進行提升)

//1、pageNum:第幾頁;pageSize:一頁多少條 Page pages=new Page(Integer.parseInt(pageNum),Integer.parseInt(pageSize)); //2、定義條件接收處理,,,假設現在不需要條件 Wrapper w= new En

史上最簡單的SpringCloud教程 | : 服務消費者(Feign)

最新Finchley版本請訪問: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f3-feign/ 或者 http://blog.csdn.net/forezp/article/details/810409

java基礎知識——

java中方法的介紹  函式:Java就是方法。              方法:就是完成特定功能的程式碼塊 格式: 修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2…) {