文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>我的NHibernate之路(2)---主子表(一对多)配置篇

我的NHibernate之路(2)---主子表(一对多)配置篇

时间:2010-09-23  来源:tyb1222

  通过我上篇文章的配置,单独做一张表的操作已经够了。但是在我们实际开发的过程中,很多时候数据库中都存在着主子表等关系,这时候就存在主表中的一条记录可能对应多条字表中的记录。那么这种情况下,我们还用上篇文章的的简单配置就不够了。下面我通过一个实际的例子说说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、对涉及的主子表的添加操作。  

    Class c = new Class();           //班级类

            Student stu = new Student();   //学生类
            stu.Name = "tao";
            stu.Tel = "123123123";
            stu.Class = c;

            c.PeopleCount = 30;      
            c.ClassCode = "03510236";
            c.Students.Add(stu);      //将学生添加到班级中

            ClassBLL cBLL = new ClassBLL();
            cBLL.AddClass(c);       //将班级、学生持久化到数据库

  总结:多对一得映射和没有主子表关联关系的表不同的地方就是需要在主、子表中分别指明映射关系,即主子表是如何映射的。添加的时候只需要将子表对应的实体添加到主表对应的实体中,然后添加主表对应的实体即完成了对主子表的操作。

  谢谢您的阅读,希望此文对你有一定的帮助!

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载