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

简介: 三个数据表 Order订单表 --------------------------------------------------------- orderid    orderdate  customer 1   2009-11-09 16:54:41.

三个数据表

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

 

 

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
6月前
|
网络协议 安全 测试技术
性能工具之emqtt-bench BenchMark 测试示例
【4月更文挑战第19天】在前面两篇文章中介绍了emqtt-bench工具和MQTT的入门压测,本文示例 emqtt_bench 对 MQTT Broker 做 Beachmark 测试,让大家对 MQTT消息中间 BenchMark 测试有个整体了解,方便平常在压测工作查阅。
483 7
性能工具之emqtt-bench BenchMark 测试示例
|
6月前
|
JSON 数据可视化 测试技术
性能测试之Artillery(示例及指标)
性能测试之Artillery(示例及指标)
78 2
|
3月前
|
关系型数据库 MySQL OLTP
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
【8月更文挑战第6天】使用 pt-query-digest 工具分析 MySQL 慢日志性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
269 0
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
|
4月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
34 4
|
4月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
21 1
|
4月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
25 0
|
6月前
|
消息中间件 监控 固态存储
性能工具之 Kafka 快速 BenchMark 测试示例
【5月更文挑战第24天】性能工具之 Kafka 快速 BenchMark 测试示例
409 1
性能工具之 Kafka 快速 BenchMark 测试示例
|
6月前
|
传感器 数据处理
示例三、光照度测试仪
示例三、光照度测试仪
50 1
|
6月前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
676 0
|
SQL 测试技术
软件测试|深入理解SQL FULL JOIN:语法、用法及示例解析
软件测试|深入理解SQL FULL JOIN:语法、用法及示例解析
97 0