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

简介: 两个数据表 Customer,客户表,现有数据如下:   -------------------------------------------------------------- CustomerId  Version FirstName   LastName 1           2       Jimmy1      Clonee --------------------------------------------------------------   Version现在不用。

两个数据表

Customer,客户表,现有数据如下:

 

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

CustomerId  Version FirstName   LastName

1           2       Jimmy1      Clonee

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

 

Version现在不用。客户表中一条记录,Jimmy1·Clonee用户

 

Order,订单表,现有数据如下:

 

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

orderid version orderdate   customer    memo

1   NULL    2009-11-09 16:54:41.013 1   1台电视

2   NULL    2009-12-12 10:29:00.543 1   2台冰箱

3   NULL    2009-12-12 10:29:01.373 1   10本书

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

 

现有3条记录,且3条记录全是Jimmy1用户的订单

数据库表名及字段名是大小写不敏感的,但做为Mapping来说,是严格的(敏感的),这点很容易理解。

 

(一)持久类

1)一对多关系中的

public class Customer

    {

        public virtual int Unid { get; set; }

        public virtual string FirstName { get; set; }

        public virtual string LastName { get; set; }

 

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

}

说明一下:客户持久实体Customer,除了3个常规的字段外(数据库表Customer表的字段),还有一个Orders属性。它代表的意思是客户的所有订单。

2)一对多关系中的

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; }

}

说明一下:订单持久实体Order,除了3个常规字段外(数据库表Order表的字段),还有一个Customer属性,此属性持久为Customer 类型,其实与数据库两表一对多关系中的链结点(外键,order表的customer字段)是有关系的。这种关系很微妙,我解释不清。表中为整型,但这里却持久为对象。

(二)映射

1)客户表映射

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

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

  <class name="Customer" table="customer">

    <id name="Unid" column="customerid">

      <generator class="native"></generator>

    </id>

    <property name="FirstName" column="firstname"></property>

    <property name="LastName" column="lastname"></property>

 

    <!--一对多关系:Customer有一个或多个Orders-->

    <set name="Orders" table="Order" generic="true" inverse="true">

      <key column="Customer" foreign-key="FK_CustomerOrders"/>

      <one-to-many class="Order"/>

    </set>

  </class>

</hibernate-mapping>

常规属性与单表映射没有太大区别,改动的地方就是多出来的那个集合属性,也就是描述(或说持久)关系表的属性。

·属性{ ISet<Order> Orders }set来映射,对应的表名为Order,这里有点不明白,为么这个Order不用添加’order’[order]

·key属性,对应order表中的customer字段(其实如果叫customerId会更好);外键名称:FK_CustomerOrders

·一对多关系中的类Order(这个是持久类Order

2)订单表映射

<?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"/>

 

 </class>

</hibernate-mapping>

订单表映射常规属性与单表映射也没有太大区别。作为一对多关系中的多的一方,只需定义:

·多对一 名称Customer,对应于持久类Order中的Customer属性(类型为Customer类类型)

·列表(对应数据库表ordercustomer字段(其实用customerId更好))

·类名,Customer

·外键:CustomerOrders

 

提示:这里有点要注意,那就是:因为订单表ordersql关键字相同,所以进行操作时,我们应该添加[order]nhibernate文档中要用到单引号,但可能由于版本原因还是其它原因,这里只能使用中括号。

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

所以这里要注意一下,最好是建表和字段时,避免此类情况。(可能影响释义性)

(三)取得客户

public IList<Customer> ShowListCustomerOrders()

        {

            return _session.CreateQuery("select c from Customer c inner join c.Orders o")

           .List<Customer>();  

        }

(四)测试

public void TestMany()

        {

            IList<Customer> _list = hh.ShowListCustomerOrders();

            Console.WriteLine(_list[0].LastName);

 

            ISet<Order> ss = _list[0].Orders;

            foreach (Order oo in ss)

                Console.WriteLine(oo.OrderDate);

        }

结果:

 

Clonee

1台电视

2台冰箱

10本书

 

(五)补充说明

对于多的一方,当前所用集合类型为 Iset泛型。

引用Lee的一段解释:

 

Bag:对象集合,每个元素可以重复。在.Net中相当于IList或者IList<T>实现。

Set:对象集合,每个元素必须唯一。在.Net中相当于ISet或者ISet<T>实现,Iesi.Collections.dll程序集提供ISet集合。

List:整数索引对象集合,每个元素可以重复。在.Net中相当于ArraryList或者List<T>实现。

Map:键值对集合。在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现

 

关于ISet这个不重复特性(须唯一),不太理解。

现在用常规的BagIList)来试一下。

 

(1)      更改Customer持久类的Orders属性

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

(2)      更改映射文件

<bag name="Orders" table="order" generic="true" inverse="true">

      <key column="Customer" foreign-key="FK_CustomerOrders"/>

      <one-to-many class="Order"/>

    </bag>

(3)      测试结果与Iset相同

 

 

更多内容请见:http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html

 

博客园大道至简

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

转载请注明:博客园

目录
相关文章
|
Web App开发 测试技术 C#
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (五)测试你的成果
本篇文章:主要介绍怎么使用这套框架。在做好配置等前期工作后。我们就是要与Mvc进行融合了。由于Mvc本人也是个初级入门者。对于这部分的研究还不是很深入。但是基本应用已经可以了。下面就让我们开始一个简单的应用实例吧: 第一步:添加control 在web项目中的controls文件夹下面添加一个UserController.cs文件。
1200 0
|
测试技术 数据库
NHibernate初探(四) 一对多关系测试示例
两个数据表 Customer,客户表,现有数据如下:   -------------------------------------------------------------- CustomerId  Version FirstName   LastName 1           2       Jimmy1      Clonee --------------------------------------------------------------   Version现在不用。
793 0
|
数据格式 XML 数据库
NHibernate初探(五) 多对多关系测试示例
三个数据表 Order订单表 --------------------------------------------------------- orderid    orderdate  customer 1   2009-11-09 16:54:41.
660 0
|
测试技术 数据库
NHibernate初探(三) 简单且完整的测试示例
按Lee的原例实现的测试解决方案。是进行以后各部分学习的基础。 (一)建立Domain类库项目。 这个项目主要用于持久类与嵌入的映射文件的存在库。 还以Customer为例子。 ·数据库中主要的三个字段:customerid,firstname,lastname ·持久类Customer的属性:Unid(这里用Unid,不用与数据库的customerid,主要目的是更好的理解mapping关系);FirstName;LastName ·引用类库:可能会用到Iesi.Collections.dll 这里代码我就不贴了。
774 0
|
23天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
106 7
Jmeter实现WebSocket协议的接口测试方法
|
23天前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
101 3
快速上手|HTTP 接口功能自动化测试
|
23天前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
31 5
|
2月前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~
下一篇
无影云桌面