通過我上篇文章的配置,單獨做一張表的操作已經夠了。但是在我們實際開 發的過程中,很多時候數據庫中都存在著主從表等關系,這時候就存在主表中的 一條記錄可能對應多條從表中的記錄。那麼這種情況下,我們還用上篇文章的的 簡單配置就不夠了。下面我通過一個實際的例子說說Nhibernate中主從表的配置 。
先介紹開發環境和軟件版本:VS2008 SP1、NHibernate-2.1.2.GA-bin。在下 面的例子中,就兩張表,一張Class表,一張Student表。這就是一個典型的主從 表的關系。
這種情況下的Nhibernate配置與上篇中的相同,所需要改變的是映射文件的 配置。操作如下:
1、映射文件配置。
主表的映射:一對多的關系。配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="NHibernateSample.Model">
<class name="NHibernateSample.Model.Class, Model" table="`Class`">
<id name="Id" type="Int32" unsaved-value="0">
<column name="ClassId" length="4" sql-type="int" not-null="true" unique="true" index="PK_Class"/>
<generator class="native" />
</id>
<property name="ClassCode" type="String">
<column name="ClassCode" length="50" sql-type="varchar" not- null="false"/>
</property>
<property name="PeopleCount" type="Int32">
<column name="PeopleCount" length="4" sql-type="int" not- null="false"/>
</property>
<bag name="Students" inverse="true" lazy="true" cascade="all- delete-orphan">
<key column="ClassId"/>
<one-to-many class="NHibernateSample.Model.Student, Model"/>
</bag>
</class>
</hibernate-mapping>
其中,黑色部分便是對一對多關系的配置。說明如下:
bag:對象結合。結合中的元素可以重復。相當於.Net中的IList或者 IList<T>.name="Students"說的是在實體類Class中有一個Students的屬 性。inverse=“TRUE”說名是子實體類維護關聯關系,它默認為FALSE,即夫實 維護關聯關系。cascade="all- delete-orphan"指明當添加主表中的記錄時,會 添加相關的記錄到字表中,此時相當於“save-update”。當刪除主表中的記錄 時,會級聯刪除字表中相關聯的記錄,此時相當於“delete”在父類中刪除對應 數據庫記錄時。即在子表中不會出現一些與主表無關聯的數據。
key:column="ClassId"說明是"ClassId"列與字表關聯
one-to-many class="NHibernateSample.Model.Student, Model"。one-to- many指明是一對多的關系。在此映射文件中一當然是指Class實體。多指的是 Model程序集中的、命名空間為NHibernateSample.Model的Student實體
從表的映射:多對已的關系。配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="NHibernateSample.Model">
<class name="NHibernateSample.Model.Student, Model" table="Student">
<id name="Id" type="Int32" unsaved-value="0">
<column name="StudentID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Student"/>
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="Name" length="50" sql-type="varchar" not- null="false"/>
</property>
<property name="Tel" type="String">
<column name="Tel" length="50" sql-type="varchar" not- null="false"/>
</property>
<many-to-one name="Class" class="NHibernateSample.Model.Class, Model">
<column name="ClassId" length="4" sql-type="int" not- null="false"/>
</many-to-one>
</class>
</hibernate-mapping>
這裡我也只說說many-to-one含義.
many-to-one:指的是多個Student對應一個Class, name="Class"指Student 實體中有一個Class的屬性。Class位於程序集Model中,它對應的是 NHibernateSample.Model.Class類。
column namee="ClassId"指的是ClassId和Class表關聯
2、對涉及的主從表的添加操作。
01 Class c = new Class(); //班級類
02
03 Student stu = new Student(); //學生類
04 stu.Name = "tao";
05 stu.Tel = "123123123";
06 stu.Class = c;
07
08 c.PeopleCount = 30;
09 c.ClassCode = "03510236";
10 c.Students.Add(stu); //將學生添加到班級中
11
12 ClassBLL cBLL = new ClassBLL();
13 cBLL.AddClass(c); //將班級、學生持久化到數據庫
總結:多對一得映射和沒有主從表關聯關系的表不同的地方就是需要在主、 從表中分別指明映射關系,即應分別在主表對應的實體類的映射文件與從表對應 的實體文件中表現出來。添加的時候只需要將從表對應的實體添加到主表對應的 實體中,然後添加主表對應的實體即完成了對主從表的操作。
謝謝您的閱讀,希望此文對你有一定的幫助!