zoukankan      html  css  js  c++  java
  • 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);

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

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

      

  • 相关阅读:
    UVA
    Codeforces 898F 字符串hash
    牛客练习赛11 B trie树+拓扑判环 E 分治求平面最近点对
    Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
    2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) D bfs思维 E bfs I Floyd找最小环 K 二分
    Educational Codeforces Round 37 E 补图求连通块 bfs+链表优化 F 线段树套路
    Codeforces 919E 数论,思维
    大数加法(主要是想记住模板)
    基础图论3
    简单并查集2hdu1213
  • 原文地址:https://www.cnblogs.com/liuguanghai/p/5031914.html
Copyright © 2011-2022 走看看