一、组件简介

  组件(Component)可以理解为被一个对象所包含的对象而持久化,而并非一个实体。简单说来,假如数据库有FirstName,LastName这两个字段,我们在C#中可以将这两个字段提取出来作为一个Name对象使用。

  示例,首先建一张表,并添加数据如下:

  

  Person.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.PersonModel, Model" table="Person2">
<id name="Id" column="Id" type="Int32">
<generator class="native"/>
</id>
<component name="Name" class="Model.NameModel,Model">
<property name="FirstName" column="FirstName" type="String"/>
<property name="LastName" column="LastName" type="String"/>
<property name="FullName" formula="FirstName + LastName" type="String"/>
</component>
<property name="Age" column="Age" type="Int32"/>
</class>
</hibernate-mapping>

  Model:

namespace Model
{
public class PersonModel
{
public virtual int Id { get; set; }
public virtual NameModel Name { get; set; }
public virtual int Age { get; set; }
} public class NameModel
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string FullName { get; set; }
}
}

  Program.cs

        static void Main(string[] args)
{
PersonDao dao = new PersonDao();
PersonModel p = dao.GetPerson(1);
Console.WriteLine(p.Name.FullName); Console.ReadKey();
}

  输出结果如下:

  

  1、每当重新加载一个包含组件的对象,如果组件的所有字段为空,那么NHibernate将假定整个组件为空。

  2、组件的属性可以是NHibernate类型(包括集合、多对一关联以及其它组件)。嵌套组件不应该作为特殊的应用被考虑。

  <parent>指定组件所属对象:

  我们修改Person.hbm.xml映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.PersonModel, Model" table="Person2">
<id name="Id" column="Id" type="Int32">
<generator class="native"/>
</id>
<component name="Name" class="Model.NameModel,Model">
<parent name="NamedPerson"/> <!-- 引用所属Person对象 -->
<property name="FirstName" column="FirstName" type="String"/>
<property name="LastName" column="LastName" type="String"/>
<property name="FullName" formula="FirstName + LastName" type="String"/>
</component>
<property name="Age" column="Age" type="Int32"/>
</class>
</hibernate-mapping>

  Name类修改如下:

    public class NameModel
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string FullName { get; set; }
public virtual PersonModel NamedPerson { get; set; }
}

  这样,我们就能够转来转去:

  Console.WriteLine(p.Name.NamedPerson.Id);

  由人获得姓名对象,从姓名对象又能够找到人。

  感觉文章至此,对组件的了解还是不够,但是又实在没有办法到哪里去找到好的资料。暂时搁置。

  

NHibernate 组件基础 (第六篇)的更多相关文章

  1. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  2. python基础-第六篇-6.2模块

    python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ ...

  3. QML基础(六篇文章)

    http://www.cnblogs.com/hicjiajia/category/350988.html

  4. 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询

    这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...

  5. bootstrap基础学习六篇

    bootstrap按钮 类 描述 .btn 为按钮添加基本样式 .btn-default 默认/标准按钮 .btn-primary 原始按钮样式(未被操作) .btn-success 表示成功的动作 ...

  6. python基础-第六篇-6.1生成器与迭代器

    迭代器 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省 ...

  7. python基础-第六篇-6.4模块混战

    我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用 ...

  8. java基础第六篇之常用思想、封装、继承和多态

    a.累加求和思想:求1~100的和,求数组/集合中元素的和,求偶数的数,求总分 int sum=0//循环外部定义sum变量,循环里面对每个元素累加 for (; ; ) { //sum+=数据 } ...

  9. 【测试基础第六篇】bug定义及生命周期

    bug定义 狭义:软件程序的漏洞或缺陷 广义:测试工程师或用户所发现和提出的软件可改进的细节(增强型.建议性)或需求文档存在差异的功能实现 职责:发现bug,提给开发,让其修改 bug类型--了解 代 ...

随机推荐

  1. LCA【p2912】 牧场散步 (USACO08OCT)

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p2912 牧场散步 题意概括 给定一个树,给你Q个询问,每次询问输入一个二元组\((x,y)\),要求求出\((x,y)\) ...

  2. H-Index II -- LeetCode

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  3. Map集合-根据宠物昵称查找宠物

    package collection; /** * 宠物类 * @author * */ public class Pet { private String name; private String ...

  4. SQL RANK、DENSE_RANK、NTILE

    现有数据如下: SELECT *, ROW_NUMBER() OVER (ORDER BY 科目) AS 'Row Number', RANK() OVER (ORDER BY 科目) AS 'Ran ...

  5. MySQL 三节点企业版

    https://promotion.aliyun.com/ntms/act/rds/mysqlenterprise.html

  6. Persisting iOS Application Data in SQLite Database Using FMDB

    In previous articles we have utilized NSUserDefaults and .NET web services to persist iPhone data. N ...

  7. 用nodejs和js写增删查模块

    文件目录如下:public是静态资源文件,index.html入门页面,server.js就是用nodejs创建的服务端代码,users.json就类似是数据库. 目录 显示界面 listUsers ...

  8. 将ascll码转换成数值进行运算

    #include "stdlib.h"#include "stdio.h"int main() { char a[8] = { 49,32,33,61,62,6 ...

  9. IP头,TCP头,UDP头,MAC帧头定义

    一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6];    // ...

  10. Python 面向对象一(转载)

    一.前言 1.面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 2.类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 3.对象,根据模板创建 ...