NHibernate 组件基础 (第六篇)

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);

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

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

  

时间: 2024-10-27 01:34:56

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

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

NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来一个简单的例子,然后随着不断地对这个例子修修改改,从而真正了解映射文件.具体的资料可以查看http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 先来看一张表: 映射文件Product.hbm.xml: <?xml versi

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release

python基础-第六篇-6.2模块

python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ 模块定义 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成 (函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块.

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

我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用模块进行功能分类 单文件编程 来!先看一个用单文件函数式编程实现所有的功能的例子 #数据源 database = { 'engine':'mysql', 'host':'localhost', 'port':3306, 'user':'root', 'password':'123' } #用户权限认

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

迭代器 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 names = iter(['alex','wupeiqi','eva']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) #在往下取就报错 # print(names.

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

这里举例子用的是:部门与员工的关系. 一个部门可以对应多个员工,这就是很明显的多对一关联关系. 我们需要建立两个实体类:员工(Employee).部门(Department) 员工类:Employee.java(在这里边我们增加了一个Department类型的属性,用来做关联) package cn.itcast.hibernate.domain; public class Employee { private int id; private String name; private Depar

【SSH三大框架】Struts2基础第六篇:自定义拦截器功能

在做web项目的时候肯定需要做登陆验证等权限的管理,如果不经过登陆就要使用相应的权限是不可以的.所以需要用到拦截器,拦截器的功能在struts2中已经集成,当然也可以在Spring中使用,这就会在后来写Spring博客的时候再写了. 接下来,我们做一个登陆验证,未登陆不能够访问一些方法: 首先,我们创建一个web项目,并且配置一些Struts2的jar包和web.xml文件,这两个就不多说了. 我们首先写一个登陆获得session的界面:index.jsp <%@ page language=&qu

第六篇 模块基础

目录 第六篇 模块基础 一 模块的四种形式 二 import和from...import 三 循环导入问题 四 模块的搜索路径 五 python文件的两种用途 六 包 第六篇 模块基础 一 模块的四种形式 啥是模块 模块是一系列功能的集合体,而函数是某一功能的集合体,因此模块可以看成是一堆函数的集合体.一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块.如果这个py文件的文件名为module.py,模块名则是module. 模块的四种形式 2.1 自定义模块:如果你自己写一个P

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver