• NHibernate初探(五) 多对多关系测试示例


    三个数据表

    Order订单表

    ---------------------------------------------------------

    orderid    orderdate  customer

    1   2009-11-09 16:54:41.013  1

    2   2009-12-12 10:29:00.543  1

    3   2009-12-12 10:29:01.373  1

    -------------------------------------------------------

     

    Product商品表

    ---------------------------------------------------------

    productid  name   cost

    1   电视机  500

    2   收音机  50

    3   手机    90

    11  手机    90

    12  手机    90

    13  手机    90

    14  手机    90

    -------------------------------------------------------

     

    OrderProduct订单产品表

    ---------------------------------------------------------

    OrderId    productid

    1   2

    -------------------------------------------------------

     

    其中OrderProduct表中有一条记录,记录了订单号为1的订单的产品为产品号为2的产品,即

    订单1是一台价值50元的收音机

     

    (一)[Order] 订单表持久(多对多中的第一多)

    public class Order

        {

            public virtual int Unid { get; set; }

            public virtual DateTime OrderDate { get; set; }

            public virtual string Memo { get; set; }

     

            public virtual Customer Customer { get; set; }

     

            public virtual IList<Product> Products { get; set; }

        }

    其中Products属性为新加的,为每一个订单都有一个产品集,即一个订单对应多个产品

    (二)Product产品表持久(多对多中的第二多)

    public class Product

        {

            public virtual int Unid { get; set; }

            public virtual string ProductName { get; set; }

            public virtual int Cost { get; set; }

     

            public virtual IList<Order> Orders { get; set; }

    }

    除了3个常规的持久属性外,还有一个Orders属性,表示每个产品都有一个订单集,即一种(一个)商品对应多个订单

    (三)订单映射

    <?xml version="1.0" encoding="utf-8" ?>

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">

     <class name="Domain.Entities.Order,Domain" table="[Order]" >

        <id name="Unid" column="OrderId" type="Int32" unsaved-value="0">

          <generator class="native" />

        </id>

        <property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" />

        <property name="Memo" column="Memo" type="String"/>

       <!--多对一关系:Orders属于一个Customer-->

       <many-to-one name="Customer" column="Customer" not-null="true" class="Customer" foreign-key="FK_CustomerOrders"/>

     

       <bag name="Products" generic="true" table="OrderProduct">

         <key column="OrderId" foreign-key="FK_orderproduct_order"/>

         <many-to-many column="ProductId"

                    class ="Domain.Entities.Product,Domain"

                    foreign-key="FK_orderproduct_product"/>

       </bag>

     </class>

    </hibernate-mapping>

    在原有文件的基础上添加了多对多关系映射,这里说明一下:

    ·Order持久类中的IList<Product> Products属性,为Ilist泛型集合,在nhibernate中与bag对应。

    ·bag的名称为Products,即属性Products

    ·外键,OrderId,这个是两者关系表(OrderProduct)表中的OrderId,这个不是映射关系,而是数据库字段,大小写不敏感。

    ·外键名称FK_orderproduct_order

    ·多对多映射,对应多个产品,类型为Product持久类型,外键FK_orderproduct_product为产品对两者关系表的外键

    (四)产品映射

    <?xml version="1.0" encoding="utf-8" ?>

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">

      <class name="Domain.Entities.Product,Domain" table="Product" >

        <id name="Unid" column="productid" type="Int32" unsaved-value="0">

          <generator class="native" />

        </id>

        <property name="ProductName" column="[name]" type="String" not-null="true" />

        <property name="Cost" column="Cost" type="Int32"/>

        

          <bag name="Orders" generic="true" table="OrderProduct">

          <key column="productid" foreign-key="FK_orderproduct_product"/>

          

          <many-to-many column="OrderId"

                      class="Domain.Entities.Order,Domain"

                      foreign-key="FK_orderproduct_order"/>

        </bag>

     

      </class>

    </hibernate-mapping>

    三个常规属性除外,与订单表同理的bag映射

    ·IList<Order> Orders

    ·bag的名称为Orders,即属性Orders

    ·外键,productid,这个是两者关系表(OrderProduct)表中的productid,这个不是映射关系,而是数据库字段,大小写不敏感。

    ·外键名称FK_orderproduct_product

    ·多对多映射,对应多个产品,类型为Product持久类型,外键FK_orderproduct_order为订单对两者关系表的外键

     

    说明:多对多关系的实现由中间的一个一对一表来实现,所以这种关系带有很好的对称性。所以可以在对称性上来理解这种微妙的关系。

    未完

    更多内容请参见:http://www.cnblogs.com/lyj/archive/2008/10/27/1320764.html

     

     

     

  • 相关阅读:
    聊聊自定义实现的SPI如何与spring进行整合
    聊聊读源码这件事
    聊聊自定义SPI如何使用自定义标签注入到spring容器中
    聊聊如何自定义数据脱敏
    聊聊自定义SPI如何与sentinel整合实现熔断限流
    排查not eligible for getting processed by all BeanPostProcessors
    SqlServer 数据脱敏脚本
    WPF 窗体使用 Show() 单个显示并设置弹窗相对于主窗体位置
    【SQLite】获取插入 ID 的几种方式
    Winform DataGridView 行单元格增加自定义 ToolTip
  • 原文地址:https://www.cnblogs.com/jams742003/p/1623432.html
Copyright © 2020-2023  润新知