1:创建两张表T_Country、T_Person;其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person

CREATE TABLE [dbo].[T_Country](
[CountryID] [int] IDENTITY(1,1) NOT NULL,
[CountryName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_T_Country] PRIMARY KEY CLUSTERED
(
[CountryID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] CREATE TABLE [dbo].[T_Person](
[PersonID] [int] IDENTITY(1,1) NOT NULL,
[PersonName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[CountryID] [int] NULL,
CONSTRAINT [PK_T_Person] PRIMARY KEY CLUSTERED
(
[PersonID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

2:实体代码如下,其中CountryModel类中有个IList<PersonModel>,PersonModel对应数据中CountryID对CountryModel,就没在属性中显示:

    public class CountryModel
{
public virtual int Countryid { get; set; }
public virtual string Countryname { get; set; }
public virtual IList<PersonModel> person { get; set; }
} public class PersonModel
{
public virtual int Personid { get; set; }
public virtual string Personname { get; set; }
public virtual CountryModel counrtry { get; set; }
}

3:XML映射文件的内容,此处所延迟加载lazy都设为false,关于延迟加载后面的文章再写

3.1 CountryModel.hbm.xml文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
<class name="CountryModel" table="T_Country" lazy="false" >
<id name="Countryid" column="CountryID">
<generator class="identity" />
</id>
<property name="Countryname">
<column name="CountryName" sql-type="nvarchar" not-null="false" />
</property>
<bag name="person" table="T_Person" generic="true" inverse="true" lazy="false">
<key column="Countryid"></key>
<one-to-many class="PersonModel"></one-to-many>
</bag>
</class>
</hibernate-mapping>

3.2 PersonModel.hbm.xml文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
<class name="PersonModel" table="T_Person" lazy="false" >
<id name="Personid" column="PersonID">
<generator class="identity" />
</id>
<property name="Personname">
<column name="PersonName" sql-type="nvarchar" not-null="false" />
</property>
<many-to-one name="counrtry" column="Countryid" class="CountryModel"></many-to-one>
</class>
</hibernate-mapping>

4: 主要代码如下,其它代码可以直接从源代码进行下载:

protected void Button1_Click(object sender, EventArgs e)
{
CountryModel model = new CountryModel();
model.Countryname = "中国"; CountryBll.Add(model); Response.Write("成功");
} protected void Button5_Click(object sender, EventArgs e)
{
CountryModel countModel = new CountryModel();
countModel.Countryname = "韩国";
CountryBll.Add(countModel);
IList<PersonModel> list = new List<PersonModel>();
for (int i = 0; i < 3; i++)
{
PersonModel model = new PersonModel();
model.Personname = "代号" + i.ToString();
model.counrtry = countModel;
list.Add(model);
PersonBll.Add(model);
}
Response.Write("成功");
} protected void Button6_Click(object sender, EventArgs e)
{
CountryModel model = CountryBll.findById(1);
PersonModel pmodel = new PersonModel();
pmodel.counrtry = model;
pmodel.Personname = "踏浪帅";
PersonBll.Add(pmodel);
Response.Write("成功");
} protected void Button2_Click(object sender, EventArgs e)
{
IList<PersonModel> list = PersonBll.findAll();
Response.Write("---------------------------------<br/>");
foreach (PersonModel item in list)
{
Response.Write("用户名:" + item.Personname + "-国家;" + item.counrtry.Countryname + "</br>");
}
Response.Write("---------------------------------<br/>");
IList<CountryModel> counList = CountryBll.findAll();
foreach (CountryModel item in counList)
{
Response.Write("-------------------" + item.Countryname + "-------------------</br>");
foreach (PersonModel person in item.person)
{
Response.Write(person.Personname + "<br/>");
}
}
}

效果图:

5:many-to-one的XML属性说明:

<many-to-one
name="PropertyName"
column="column_name"
class="ClassName"
cascade="all|none|save-update|delete"
fetch="join|select"
update="true|false"
insert="true|false"
property-ref="PropertyNameFromAssociatedClass"
access="field|property|nosetter|ClassName"
unique="true|false"
optimistic-lock="true|false"
not-found="ignore|exception"
/>

(1) name:属性名。 
(2) column数据库字段名 
(3) class(可选 - 默认是通过反射得到属性类型): 关联的类的名字。 
(4) cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。 
(5) fetch (可选 - 默认为 select): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。 
(6) (可选 - defaults to true) 指定对应的字段是否包含在用于UPDATE 和/或 INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的
“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序。 
(7) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。 如果没有指定,会使用对方关联类的主键。 
(8) access(可选 - 默认是 property): NHibernate用来访问属性的策略。 
(9) unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。 
(10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性
发生脏数据时版本(version)的值是否增长。 
(11) not-found (可选 - 默认为 exception): 指定外键引用的数据不存在时如何处理: ignore会将数据不存在作为关联到一个空对象(null)处理。

感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;源代码下载

转载至:http://www.cnblogs.com/wujy/p/3602249.html

NHibernate初学五之关联一对多关系的更多相关文章

  1. NHibernate初学六之关联多对多关系

    1:创建三张表T_Course.T_Student.T_Middle:其中一个学生可以对应多个课程,一个课程也可以对应多个学生,用T_Middle存放它们的关系内容: CREATE TABLE [db ...

  2. 嵌套查询--------关联一对多关系----------collection

    参考来源:   http://www.cnblogs.com/LvLoveYuForever/p/6689577.html <resultMap id="BaseResultMap&q ...

  3. NHibernate初学四之关联一对一关系

    1:数据库脚本,创建两张表T_Area.T_Unit,表示一个单位对应一个地区,在单位表中有个AreaID为T_Area表中的ID: CREATE TABLE [dbo].[T_Area]( [ID] ...

  4. [NHibernate]一对多关系(级联删除,级联添加)

    目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...

  5. [NHibernate]一对多关系(关联查询)

    目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...

  6. [Fluent NHibernate]一对多关系处理

    目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...

  7. [转]NHibernate之旅(9):探索父子关系(一对多关系)

    本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...

  8. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  9. 0050 MyBatis关联映射--一对多关系

    一对多关系更加常见,比如用户和订单,一个用户可以有多个订单 DROP TABLE IF EXISTS customer; /*用户表*/ CREATE TABLE customer( `pk` INT ...

随机推荐

  1. python super()使用详解

    1.super的作用调用父类方法2.单继承使用示例 #coding:utf-8 #单继承 class A(object): def __init__(self): self.n=2 def add(s ...

  2. 让input变成不可编辑状态的方法

    有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...

  3. gulp——myself配置

    var gulp = require('gulp'), uglify = require('gulp-uglify'), concat = require('gulp-concat'); var pu ...

  4. js屏蔽键盘按键

    3.1屏蔽键盘所有键 <script language="javascript"> <!-- function document.onkeydown(){ eve ...

  5. c++重载后置++和--

    c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数.(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现) 业余实现代码 ...

  6. dp之二维背包hdu3496

    题意:给你n张电影门票,但一次只可以买m张,并且你最多可以看L分钟,接下来是n场电影,每一场电影a分钟,b价值,要求恰好看m场电影所得到的最大价值,要是看不到m场电影,输出0: 思路:这个题目可以很明 ...

  7. tomcat8源码之架构解析

    Catalina:与开始/关闭shell脚本交互的主类,因此如果要研究启动和关闭的过程,就从这个类开始看起. Server:是整个Tomcat组件的容器,包含一个或多个Service. Service ...

  8. acrobat-网格-参考线-网格大小设置

      视图--显示/隐藏--标尺及网格-网格/标尺: 网格:ctrl+U 标尺:ctrl+R     标尺:   网格: 标尺+网格:   网格大小设置: 编辑--首选项-单位和参考线     2013 ...

  9. 基于at91sam9g10的工控板

    1 eth0: 片选 NCS2 中断 PC7 复位 PC6 2 eth1: 片选 NCS3 中断 PC5 复位 PC4 3 扩展输入GPIO0-7: PB27 PB26 PB9 PB8 PB7 PB5 ...

  10. NFS服务的端口分配

    常规的一些NFS服务设置我们已经了解了.那么对于端口问题,很多朋友并不是很清楚.这里我们就来详细介绍一下端口的分配.portmapper在NFS服务启动的时候给每一个NFS服务分配了一个动态的端口,如 ...