學時主要是看的博客和文檔
博客地址 http://www.cnblogs.com/GoodHelper/archive/2011/02/14/nhiberante_01.html 本文中部分代碼和圖便是從這裡復制過來的。
說出來有點丟人,一直只是會照貓畫虎的配,理解總是差了一線,但想找到再一次瞪眼過程中,終於把那一線過了,再之後就不用記什麼,閉著眼都能配了。
這裡用文字,顏色,少量的文檔說明,結合實例,解析每種配置實例。
相信對剛學習hibernate的同學會有幫助。
總結如下
基本映射就不多說了 屬性生成器搞定,主鍵必要時再查,聯合主鍵很少會用到。
PS 大學學數據庫是學過外鍵的,但.NET的培訓和我幾個上司的建議是不用外鍵,不過必要的時候我還是加了點……還加了級聯和觸發器
因為很少用,剛開始接觸hibernate,外鍵一段時間還比較暈,可能有和我一樣暈的
這裡補充
舉例
stuent是外鍵表,class是主鍵表
public class Class { public virtual int? ID { get; set; } public virtual string Name { get; set; } } public class Student { public virtual int? ID { get; set; } public virtual string Name { get; set; } public virtual Class Class { get; set; } }
name屬性名,class主鍵表對應的類,colum外鍵表的外鍵,property_ref 外鍵表的外鍵對應類的屬性,默認為主鍵。
閉著眼睛寫
映射關系為 :本類型的屬性 ,對應的類型為,對應關系,本類型(Student)對應的表(student)的外鍵字段類的主鍵屬性。
<class name="">
<many-to-one name="" class="" column="" property-ref=""/>
</class>
這是
默認值可以簡寫為
<many-to-one name="Class" column="ClassID"/>
簡寫是因為有默認值
class(可選 - ): 關聯的類的名字,反射可以找到對應的類型
: (可選) 指定關聯類的一個屬性,這個屬性將會和本外鍵相對應。 如果沒有指定,會使用對方關聯類的主鍵。 就是說。
下面是文檔的原話
property-ref屬性只應該用來對付老舊的數據庫系統, 可能有外鍵指向對方關聯表的是個非主鍵字段(但是應該是一個惟一關鍵字)的情況下。 這是一種十分丑陋的關系模型。比如說,假設Product類有一個惟一的序列號, 它並不是主鍵。(unique屬性控制NHibernate通過SchemaExport工具生成DDL的過程。)
還是之前的關系圖,與多對一對應
public class Student { public virtual int? ID { get; set; } public virtual string Name { get; set; } } public class Class { public virtual int? { get; set; } public virtual string Name { get; set; } public virtual IList<> { get; set; } }
一個班級可能有多個學生,學生是個集合ILIST
本類型()的主鍵——m 一對多的集合(IList<Student>)裡每個元素()所對應表()的外鍵()
<class name="" table="T_Class" lazy="true" >
<id name="" type="int" column="ClassID"> 這個ClassID只是配置Class類的主鍵
<generator class="native"/>
</id>
<bag name="">
<key column=""/> 這個ClassID實際是指類對應的Student表的字段。
<one-to-many class=""/>
</bag>
</class>
。
一、單向主鍵關聯映射
這種關系關聯配置上沒什麼新東西,主要是主鍵的配置
主鍵關聯不需要額外的表字段;如果兩行是通過這種一對一關系相關聯的,那麼這兩行就共享同樣的主關鍵字值。所以如果你希望兩個對象通過主鍵一對一關聯,你必須確認它們被賦予同樣的標識值!
<class name="" table="PERSON"> <id name="Id" column="PERSON_ID"> <generator class="foreign"> <param name="property">Employee</param> ,主鍵值 配置為通過外鍵查詢,Person的主鍵值=Exmloyee類的主鍵值 </generator> </id> ... <one-to-one name="" class="Employee" constrained="true"/> 映射關系:無視上面的主鍵配置,這節的意思是,的主鍵Id=屬性的主鍵,one-to-one 也有-ref這項,如果是主鍵則可省,唯一主外鍵一對一映射就設置了這項。
</class>
上面為單向一對一。
雙向只要在Employee類裡加Person屬性,映射裡添
<one-to-one name="Person" class="Person"/>
就OK了,Emplyee的主鍵ID=Employee類中Person屬性的ID。
用
<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/> 也可以實現相同的效果,表示是一對一,column="PERSON_ID"表示是Employee的PERSON_ID 對應的Person類的主鍵。
唯一外鍵關聯映射
單向。
<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/>
如果在Person的映射加入下面幾句,這種關聯就是雙向的:
<one-to-one name="Employee" class="Employee" property-ref="Person"/>
Person類主鍵ID=Employee類的Person屬性的主鍵ID
而下面這種直接配置多對多關系,在EF對映的是隱式的多對多。
懂單向的多對多,雙向的也是一個道理
多對多,關系,主動配置的一方,默認為ID屬性(表的主鍵)。
T_User的主鍵ID()=的,的=表的主鍵ID(RoleID)
<many-to-many class="Role" column="RoleID"/> 與上面的類似
//這個ROLE,默認關聯ROLE的ID(主鍵)
之前的某些配軒,是主鍵則可以省略不寫,不是主鍵則添加 property-ref配置,不過這個我沒試過。
<class name="" table="T_User" lazy="true" >
<id name="ID" type="int" column=""> 這是User類配置的主鍵,與下面的關系配置無關,煙霧彈。
<generator class="native"/>
</id>
<bag name="Roles" table="">
<key column=""/>
<many-to-many class="" column=""/>
</bag>
</class>