NHibernate 组件基础 (第六篇)
一、组件简介
组件(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 组件基础 (第六篇)的更多相关文章
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- python基础-第六篇-6.2模块
python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ ...
- QML基础(六篇文章)
http://www.cnblogs.com/hicjiajia/category/350988.html
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...
- bootstrap基础学习六篇
bootstrap按钮 类 描述 .btn 为按钮添加基本样式 .btn-default 默认/标准按钮 .btn-primary 原始按钮样式(未被操作) .btn-success 表示成功的动作 ...
- python基础-第六篇-6.1生成器与迭代器
迭代器 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省 ...
- python基础-第六篇-6.4模块混战
我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用 ...
- java基础第六篇之常用思想、封装、继承和多态
a.累加求和思想:求1~100的和,求数组/集合中元素的和,求偶数的数,求总分 int sum=0//循环外部定义sum变量,循环里面对每个元素累加 for (; ; ) { //sum+=数据 } ...
- 【测试基础第六篇】bug定义及生命周期
bug定义 狭义:软件程序的漏洞或缺陷 广义:测试工程师或用户所发现和提出的软件可改进的细节(增强型.建议性)或需求文档存在差异的功能实现 职责:发现bug,提给开发,让其修改 bug类型--了解 代 ...
随机推荐
- [Math Review] Statistics Basic: Sampling Distribution
Inferential Statistics Generalizing from a sample to a population that involves determining how far ...
- Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细心讲解)
layout: post title: Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细 ...
- 【hdu3652】数位dp(浅尝ACM-A)
向大佬学习 第一次写博客有点紧张,也算是小萌新的突破吧 这次主要是总结一下校内的ACM比赛的各种题,主要是新思路以及学到的新知识 先放一张 下面开始说正事 题面 A wqb-number, or B- ...
- nat的翻译类型(1)--静态nat
目的:在1.1 1.2 1.3 三台内网的服务器访问外网的服务器(202.1.1.2)时,将内网ip转换为外网ip. 1.设置内网三台服务器的Ip ,网关,以及外网服务器的ip网关 分别为:192.1 ...
- C#的多线程——使用async和await来完成异步编程(Asynchronous Programming with async and await)
https://msdn.microsoft.com/zh-cn/library/mt674882.aspx 侵删 更新于:2015年6月20日 欲获得最新的Visual Studio 2017 RC ...
- 【译】PHP之道(PHP the right way)
刚入门的同学觉得自己能用PHP写出各种程序就很NB了,但其实作为一个专业程序员,你得有个全面点的知识结构.单元测试总得听过,文档工具总得用用,Xss总得会防.推荐大家把<PHP the righ ...
- iOS开发之字符串比较
Object-c中比较两个字符串是否相等时,应该用isEqualToString:而不能仅仅只是比较字符串的指针值. NSString *str1=@"hello 1"; NSS ...
- JAVA常见算法题(九)
package com.xiaowu.demo; /** * * 一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. * * ...
- iptables 使用场景
25 Most Frequently Used Linux IPTables Rules Examples by RAMESH NATARAJAN on JUNE 14, 2011 At a firs ...
- json-server模拟接口获取mock数据
转载:http://blog.csdn.net/stevennest/article/details/76167343 安装json-server 运行以下命令 cnpm install json-s ...