上一篇:NHibernate学习笔记(一):初识NHibernate

本文的内容:
1.介绍NH如何处理对象间one-to-ont的映射关系;

经验教训:
1.操作一对一关联关系中的一个对象时,得在程序中指定如何与另一个对象关联,如在Student类中写this.NativePlace.Student = this;
2.在为类写映射文件时,必须指定类的具体的名称空间,若则运行时会出现"找不到***映射文件"的问题;
  这两点都困扰了我好长一段时间,应该要引起注意.

点击下载本文相关代码(可在上篇代码的基础上做修改)
one-to-one:
NH中处理一对一关联的方式有两种:
1.主键关联
2.惟一外键关联

本文使用主键关联处理一对一的关系。

  主键关联不需要额外的表字段;两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!

  持久化对象之间一对一的关联关系是通过one-to-one元素定义的。

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

  以下是对one-to-one元素各属性的说明:
  1.name:属性的名字
  2.class:(可选 - 默认是通过反射得到的属性类型): 被关联的类的名字
  3.cascade:(可选) 表明操作是否从父对象级联到被关联的对象
  4.constrained:(可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响Save()Delete()在级联执行时的先后顺序(也在schema export tool中被使用)
  5.outer-join:(可选 - 默认为 auto):当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取
  6.property-ref:(可选): 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键
  7.access:(可选 - defaults to property): NHibernate 用来访问属性的策略

本文所涉及的类说明:
其中BizObject、User、ObjectBroker、Sessions等四个类就是NHibernate学习笔记(一):初识NHibernate这篇文章定义的。
Student类和NativePlace类是一对一的双向关联关系:类Student通过属性NativePlace关联类NativePlace;类NativePlace通过属性Student关联类Student。

类Student的代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace NHibernateTest
{
    public class Student : User
    {
        fields#region fields
        private NativePlace objNativePlace;
        #endregion

        constructors#region constructors
        public Student()
        {
            objNativePlace = new NativePlace();
        }

        public Student(int StudentID) : base(StudentID) { }
        #endregion

        properties#region properties
        public NativePlace NativePlace
        {
            get
            {
                return objNativePlace;
            }
            set
            {
                objNativePlace = value;
            }
        }
        #endregion

        methors#region methors
        public bool addNewStudent()
        {
            try
            {
                this.NativePlace.Student = this;
                this.Create();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        public bool deleteStudent()
        {
            try
            {
                this.NativePlace.Student = this;
                this.Delete();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        public bool updateStudent()
        {
            try
            {
                this.NativePlace.Student = this;
                this.Update();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }
        #endregion
    }
}

  在每次操作Student对象时,都得指定NativePlace.Student,如:this.NativePlace.Student = this;如果没写这一行运行时会出现“could not find class:NativePlace”(我就在写卡了好久)

类NativePlace的代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace NHibernateTest
{
    public class NativePlace : BizObject
    {
        fields#region fields
        private int intNPID;
        private string strCity;
        private string strProvince;
        private Student objStudent;
        #endregion

        properties#region properties
        public int NPID
        {
            get
            {
                return intNPID;
            }
            set
            {
                intNPID = value;
            }
        }

        public Student Student
        {
            get
            {
                return objStudent;
            }
            set
            {
                objStudent = value;
            }
        }

        public string Province
        {
            get
            {
                return strProvince;
            }
            set
            {
                strProvince = value;
            }
        }

        public string City
        {
            get
            {
                return strCity;
            }
            set
            {
                strCity = value;
            }
        }
        #endregion
    }
}

  这两个类的定义相对于User类没有什么太大的区别,接下来介绍两个类的配置文件。

  从UML来看,类NativePlace与类User之间是集合(构成)关系,即类NativePlace属于类Student的一部分,但不能独立存在,也就是说类NativePlace是依赖于类User的。

数据库脚本:

--表Users:用于保存Student对象
Create Table [Users]
(
  [ID] int identity(1,1) constraint PK_UserID1 Primary Key,
  [UserName] varchar(20) not null,
  [Password] varchar(20) not null
)

--表NativePlace:用于保存NativePlace对象
Create Table NativePlace
(
  --表NativePlace与表Users通过主键关联,则需保证两表的主键名一致
  ID int Constraint PK_NativePlaceID Primary Key,    
  Province varchar(50),
  City varchar(50)
)

类Student的映射文件:

<?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"/>
    
    <one-to-one name="NativePlace" class="NHibernateTest.NativePlace,NHibernateTest" cascade="all" />
  </class>
</hibernate-mapping>

类NativePlace的映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="NHibernateTest.NativePlace,NHibernateTest" table="NativePlace">
    <id name="NPID" column="ID" type="Int32" unsaved-value="0">
      <generator class="foreign">
        <param name="property">Student</param>
      </generator>
    </id>
    <property name="Province" column="Province" type="String" length="50"/>
    <property name="City" column="City" type="String" length="50"/>
    
    <one-to-one name="Student" class="NHibernateTest.Student,NHibernateTest" cascade="all" constrained="true"></one-to-one>
  </class>
</hibernate-mapping>

注意:如果采用<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">这种声明的话,请在之后指写相关联类的名字时请指出完整的类名(名称空间+类名)和程序集名:如<class name="NHibernateTest.NativePlace,NHibernateTest" table="NativePlace">和<one-to-one name="Student" class="NHibernateTest.Student,NHibernateTest" cascade="all" constrained="true"></one-to-one>

接下来是测试类:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace NHibernateTest
{
    public partial class frmStudent : Form
    {
        public frmStudent()
        {
            InitializeComponent();
        }

        Student objStudent;

        //Add New Student
        private void button1_Click(object sender, EventArgs e)
        {
            objStudent = new Student();

            objStudent.UserName = "jailu";
            objStudent.Password = "123";
            objStudent.NativePlace.Province = "FuJian";
            objStudent.NativePlace.City = "LongYan";

            if (objStudent.addNewStudent())
            {
                MessageBox.Show("Success");
            }
            else
            {
                MessageBox.Show("UnSuccess");
            }
        }

        //Update
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            objStudent.UserName = "Update UserName";
            objStudent.NativePlace.Province = "Update Province";

            if (objStudent.updateStudent())
            {
                MessageBox.Show("Success");
            }
            else
            {
                MessageBox.Show("UnSuccess");
            }
        }

        //Delete
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (objStudent.deleteStudent())
            {
                MessageBox.Show("Success");
            }
            else
            {
                MessageBox.Show("UnSuccess");
            }
        }
    }
}

  所有的类和映射文件都写好了,运行...成功.

转载于:https://www.cnblogs.com/jailu/archive/2006/06/29/438463.html

NHibernate学习笔记(二):one-to-one关系映射相关推荐

  1. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  2. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

  3. Java学习笔记二:数据类型

    Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...

  4. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  5. 项目管理学习笔记二:信息系统服务管理

    项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...

  6. ROS学习笔记二:探索ROS文件系统

    ROS学习笔记二:探索ROS文件系统 ROS针对自己文件的特性,具有一些自己的工具命令,当针对ROS文件进行操作的时候是非常方便的.这些命令和ubuntu系统原有的命令相似但却不同,单独针对ROS文件 ...

  7. SEO学习笔记二:在搜索引擎竞价排名环境下,个人网站将何去何从?

    本文首发于「妙蛙种子前端」博客,欢迎关注- 早期的搜索引擎,大家都在一个相对公平的规则内玩耍:你的内容够好,网站体验更优秀,在搜索引擎中的排名一般都会比较高. 因为搜索引擎能便捷的为我们定位到精准的内 ...

  8. 计算鬼成像学习笔记二:二阶关联函数探究

    计算鬼成像学习笔记二:二阶关联函数探究 1 一阶关联函数 2 二阶关联函数 3 二阶关联如何重构物体 4 差分鬼成像关联公式 5 归一化鬼成像关联公式 1 一阶关联函数 一阶关联函数是光场的电场强度之 ...

  9. 学习笔记二.矩阵按键

    #学习笔记二:GPIO的探索与矩阵按键 ##1.在配置cubemx时,对gpio的配置有开漏输出和推挽输出两种方式, ###这里有一篇文章(别人的文章)讲的很详细link戳这里跳转 通俗来讲,推挽输出 ...

最新文章

  1. 基于pytorch后量化(mnist分类)---浮点训练vs多bit后量化vs多bit量化感知训练效果对比
  2. 会话管理之session技术
  3. atitit.词法分析的实现token attilax总结
  4. prepare 和 row_count()一起使用的误区
  5. for-each 循环原理
  6. CSS3展开带弹性动画的手风琴菜单
  7. 由中行IBM大型机宕机谈银行系统运维
  8. Python:常用模块简介(1)
  9. linux权限体系有哪些角色,详解Linux下系统权限
  10. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
  11. 30天敏捷结果(6):周五回顾,找到三件做的好以及三件需要改善的事情
  12. Linux服务器创建及维护记录
  13. dubbo源码解析-router
  14. opmanager邮件告警配置
  15. 多个panel控件重合使用时,某个panel控件不显示问题?
  16. 亚嵌教育李明:一生的学习
  17. 技术交流:springboot配置阿里云日志服务与log4j2 lookup
  18. 怎么转换书法字体?教你快速转换毛笔字体
  19. 07中华小姐大赛落幕 20岁佳丽曾光夺冠
  20. 介绍两款常用的“图表统计图的插件

热门文章

  1. 一份非常完整的 MySQL 规范
  2. 跨网段远程调试vs_如何提高后台服务应用问题的排查效率?日志 VS 远程调试
  3. ngod规范_NGOD的架构说明与比较
  4. php 打印对象到文件,php实现将数组或对象写入到文件的方法小结【三种方法】...
  5. Spring Boot @Conditional 注解
  6. 曾以为只能拿8K,22届学弟字节校招心路历程
  7. freeradius的proxy功能
  8. 子进程无法从标准输入读取数据
  9. HTML5_02之视频、音频、Canvas
  10. ceph集群报 Monitor clock skew detected 错误问题排查,解决