本文的内容:
  介绍NH如何处理对象间many-to-one,one-to-many和many-to-many的双向映射关系(本文主要介绍了映射文件,对于类的生成可以跟据前两篇描述的方法生成);

经验教训:

相关类图:(下面的类图包含一对一,多对一,一对多和多对多)
many-to-one描述多对一的一种数据模型,它指定many一方是不能独立存在的,我个人认为many-to-one是NHB中保证数据有效性的最有用的一种映射,通过使用many-to-one能有效的防治孤儿记录被写入到数据表中。在本文描述的例子中,Student类和Classes类之间是多对一关系.

  通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。这种关系模型是多对一关联。(实际上是一个对象引用。)在映射文件中用many-to-one标签描述此种关系.

<many-to-one
        name="propertyName"(1)
        column="column_name"(2)
        class="ClassName"(3)
        cascade="all|none|save-update|delete"(4)
        outer-join="true|false|auto"(5)
        update="true|false"(6)
        insert="true|false"(7)
        property-ref="propertyNameFromAssociatedClass" (8)
        access="field|property|ClassName"(9)
        unique="true|false" (10)
/>

1.name:属性名。指出many一方的类用哪个属性和one一方的类关联.
2.column:字段名(可选).指出many一方的类对应的数据表用哪个列和one一方的类对应的数据表关联(两表之间存在外键关联);
3.class:关联的类的名字(可选 - 默认是通过反射得到属性类型);
4.cascade:指明哪些操作会从父对象级联到关联的对象(可选).cascade属性允许下列值:: all, save-update, delete, none. 设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。
5.outer-join:当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取(可选 - 默认为auto).outer-join参数允许下列三个不同值: auto(使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy) ),true(一直使用外连接来抓取关联),false(永远不使用外连接来抓取关联);
6.update,insert:指定对应的字段是否在用于UPDATE和/或INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序(可选 - 默认为true)
7.property-ref:指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键(可选).property-ref属性只应该用来对付老旧的数据库系统,可能出现外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况。这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号,它并不是主键;
8.access:NHibernate 用来访问属性的策略(可选 - 默认为property)
9.unique:允许产生外键列唯一约束的数据库定义语言(DDL)(可选)

那么关于Student的映射可能是:

<many-to-one name="Classes" column="cID" unique ="true"/>

只要在原Student.hbm.xml映射文件中添加many-to-one标签就可以了.

对于Sturent类得添加一个属性Classes:Classes

one-to-many
一对多也是一种常见的数据模型,在按范式设计的数据库中随处可见。在NHB中通过one-to-many可以非常方便的处理这种模型,同时NHB还提供了级联更新和删除的功能,以保证数据完整性。在本文描述的例子中,Classes类和Student类是一对多的关系.

Classes类的映射文件:Classes.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="NHibernateTest.Classes,NHibernateTest" table="Classes">
    <id name="ClassesID" column="ID" type="Int32" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="ClassesName" column="ClassName" type="String" length="50"/>

<bag name="StudentList" cascade="all"  inverse="true">
      <key column="ID" />
      <one-to-many class="NHibernateTest.Student,NHibernateTest" />
    </bag>
  </class>
</hibernate-mapping>

  如映射文件所示,one-to-many标签必须包含在标签bag中(个人理解:多嘛,就用一个包装起来~)
        bag标签的name属性指出Address对象用哪个属性和Student对象关联,inverse属性使collection不更新连接(总之,这个属性提高了性能,具体的情况请参考NHibernate的帮助文档).
  key标签的column属性指出了Address对象对应的数据表用哪个字段和Student对象对应的数据表关联
  one-to-many标签的class属性指出了Address和哪个对象关联.

对于Classes类得创建一个StudentList : Student的属性,用来描述与Student对象的关系.

many-to-many多对多在数据库中也是常见的数据模型,像用户与组,用户与权限等。多对多关系需要通过一个中间表实现,element的就是读取这个中间表中某列的值。在本文的例子中,Student类和Subject类是多对多的关系.

  Student的映射可能是:

<bag name="SubjectList" table="r_Student_Subject" inverse="true" cascade="save-update" lazy="false">
      <key column="StudentID" />
      <many-to-many class="NHibernateTest.Subject,NHibernateTest" column="ID" outer-join="auto" />
    </bag>

  在bag标签中,加入了一个table属性,它指定一个实现多对多的中间表

  完整的Student.hbm.xml源码如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="NHibernateTest.Student,NHibernateTest" table="Users">
    <id name="UserID" column="ID" type="Int32" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="UserName" column="UserName" type="String" length="20"/>
    <property name="Password" column="Password" type="String" length="20"/>

<!--Student类和NativePlace类是一对一的关系-->
    <one-to-one name="NativePlace" class="NHibernateTest.NativePlace,NHibernateTest" cascade="all" />

<!--Student类和Classes类是多对一的关系-->
    <many-to-one name="Classes" column="cID" unique ="true"/>

<!--Student类和Address类是一对多的关系-->
    <bag name="AddressList" cascade="all"  inverse="true">
      <key column="ID" />
      <one-to-many class="NHibernateTest.Address,NHibernateTest" />
    </bag>

<!--Student类和Subject类是多对多的关系-->
    <bag name="SubjectList" table="r_Student_Subject" inverse="true" cascade="save-update" lazy="false">
      <key column="StudentID" />
      <many-to-many class="NHibernateTest.Subject,NHibernateTest" column="ID" outer-join="auto" />
    </bag>
  </class>
</hibernate-mapping>

  Student类得添加类型为IList的属性SubjectList表示与类Subject的关系.

  由于Student的映射关系比较复杂,本文就再熬述它的CRUD操作,具体的操作方法请参考本文附带的代码.

转载于:https://www.cnblogs.com/zhl7522/archive/2007/10/25/937161.html

NHibernate学习笔记(转载):many-to-one/one-to-many/many-to-many关系映射相关推荐

  1. NHibernate学习笔记(二):one-to-one关系映射

    上一篇:NHibernate学习笔记(一):初识NHibernate 本文的内容:1.介绍NH如何处理对象间one-to-ont的映射关系: 经验教训: 1.操作一对一关联关系中的一个对象时,得在程序 ...

  2. oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系

    天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...

  3. 阿龙的学习笔记---转载及精炼总结github仓库:cpp-backend-reference

    -> 转载自https://github.com/chankeh/cpp-backend-reference 突击复习常见题,要提前批了,之前的忘了不少,知识广度先再拓展一下.文章中的一些详细讲 ...

  4. away3d学习笔记 转载

    http://abcdefgea.blog.163.com/blog/static/13278774120121155041956/ away3D_4.1.0_教程使用到的3D文件格式 .3ds(3D ...

  5. JBI学习笔记(转载于gaolin_bei)

    2019独角兽企业重金招聘Python工程师标准>>> 业界正在广泛寻求解决 B2B 以及 EAI (企业应用集成)所存在问题的方案.这些方案不同于基于 JMS 手段的面向消息中间件 ...

  6. HUAWEI视讯技术学习笔记(转载)

    一.平台介绍 业务管理 SMC2.0 . 网络控制 网络控制的核心--SC(switch center),是视讯业务的交换控制中心,主要有地址解析.接入控制.带宽管理.呼叫管理等功能.SC的交换控制是 ...

  7. Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程

    Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...

  8. oracle java写目录权限_oracle分配权限 学习笔记--转载

    在全局数据库ORCL下创建一个用户 首先在开始-->运行-->sqlplus,然后输入 sys/change_on_install as sysdba 以sys权限登陆进去 然后可以进行操 ...

  9. Java学习笔记45:Java 线程与主线程之间的变量关系

    运行下面的代码: package com.test.www;public class Test {public static int count = 0;public static void inc( ...

最新文章

  1. java怎么接收多选框多数据_表id关联数据获取至页面,制作下拉框多选进行数据多项获取(字段处理)...
  2. sdcard不可执行.
  3. 《Linux内核设计与实现》读书笔记(十四)- 块I/O层
  4. 【最新合集】编译原理习题(含答案)_11-14中间代码生成_MOOC慕课 哈工大陈鄞
  5. 计算机永远无法处理日语所具有的暧昧性,计算机永远无法处理日语所具有的暧昧性。( )...
  6. 云测试软件详解,软件测试之登录测试详解
  7. 4、Linux的文件系统结构(目录树结构)
  8. 搭建hadoop分布式集群
  9. 完美解决:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求...
  10. oracle机票,全球机票分销系统
  11. .NET程序不需要受SVN版本控制的文件类型
  12. 系统可行性研究报告模板
  13. Linux下rpm包x86、i386、i486、i586、i686和x86_64这些后缀含义
  14. 基于SSM实现新闻发布系统
  15. 一文读懂局域网、广域网、WLAN、WiFi的联系与区别
  16. win10电脑桌面透明便签_DesktopNoteOK桌面便签小工具下载|windows10桌面透明便签插件_最火软件站...
  17. 使用哈尔滨工业大学SCIR的开源代码训练自己的ELMo
  18. Oracle--ORA-01144 报错解决方案
  19. VSTO插件供WPS使用
  20. Android 启用/禁用蓝牙传输文件功能(不能影响蓝牙耳机听歌)

热门文章

  1. ubuntu19.10安装remarkable
  2. 正则表达式中?的用法
  3. 5.4 加权最小二乘法
  4. 计算机科学与技术第2次上机实验,天大计算机科学与技术学院—汇编语言—上机实验报告302...
  5. h5调微信支付 unkonw url_聚合支付系统设计(一)
  6. 全国计算机等级考试收费不一样,2018年北京全国计算机等级考试收费标准
  7. Chrome的vimium插件的使用笔记
  8. [译]模型-视图-提供器 模式
  9. MySQL集群搭建--多主模式
  10. 坚持不放弃,修得好结果。