zoukankan      html  css  js  c++  java
  • NHibernate系列文章十五:NHibernate组件

    摘要

    前面文章介绍了NHibernate对简单.net数据类型的映射对照表。NHibernate也可以映射复杂数据类型,这里介绍通过组件映射NHibernate值对象。

    1. NHibernate引用对象和NHibernate值对象

    • NHibernate引用对象:指的是具有主键值的NHibernate实体对象,他必须是另一个NHibernate实体对象的属性。他所属的对象也可以理解为主对象,有一个从属的指向关系。例如:Order对象有个属性Customer,表示这个Order对象是属于哪个Customer的。
    • NHibernate值对象:指的是一般的.net对象,他没有主键,不具有唯一性,他可以是属于一个NHibernate实体对象的属性,也可以不“挂靠”在任何NHibernate实体对象上。例如:有个Address类街道地址、邮政编码、国家、省份、城市信息,Customer对象有个名称为Address的Address类属性对象,这个Address属性对象就是NHibernate值对象。

    NHibernate引用对象由NHibernate引用映射定义,在后面文章介绍。本节介绍如何映射NHibernate值对象。

    2. 程序演示

    添加Address类

    1     public class Address
    2     {
    3         public virtual string Street { get; set; }
    4         public virtual string City { get; set; }
    5         public virtual string Province { get; set; }
    6         public virtual string Country { get; set; }
    7     }

    修改Customer类,将string类型的Street、City、Province、Country属性改成了Address类的Address属性。

     1     public class Customer
     2     {
     3         public virtual Guid Id { get; set; }
     4         public virtual string FirstName { get; set; }
     5         public virtual string LastName { get; set; }
     6         public virtual double AverageRating { get; set; }
     7         public virtual int Points { get; set; }
     8         public virtual bool HasGoldStatus { get; set; }
     9         public virtual DateTime MemberSince { get; set; }
    10         public virtual CustomerCreditRating CreditRating { get; set; }
    11         public virtual Address Address { get; set; }
    12     }

    修改Customer.hbm.xml文件,添加component节点,设置节点的name属性为“Address”,里面包含Address的属性。

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemoApp" namespace="NHibernateDemoApp">
      <class name="Customer" table="Customer">
        <id name="Id">
          <generator class="guid.comb"/>
        </id>
        <property name="FirstName" not-null="true"/>
        <property name="LastName" not-null ="true"/>
        <property name="AverageRating"/>
        <property name="Points"/>
        <property name="HasGoldStatus"/>
        <property name="MemberSince"/>
        <property name="CreditRating" type="CustomerCreditRating"/>
        <component name="Address">
          <property name="Street"/>
          <property name="City"/>
          <property name="Province"/>
          <property name="Country"/>
        </component>
      </class>
    </hibernate-mapping>

    修改CreateCustomer方法

     1         private static Customer CreateCustomer()
     2         {
     3             var customer = new Customer
     4             {
     5                 FirstName = "Daniel",
     6                 LastName = "Tang",
     7                 Points = 100,
     8                 HasGoldStatus = true,
     9                 MemberSince = new DateTime(2012, 1, 1),
    10                 CreditRating = CustomerCreditRating.Good,
    11                 AverageRating = 42.42424242,
    12                 Address = new Address
    13                 {
    14                     Street = "123 Somewhere Avenue",
    15                     City = "Nowhere",
    16                     Province = "Alberta",
    17                     Country = "Canada"
    18                 }
    19             };
    20             
    21             return customer;
    22         }

    修改Main函数

     1         static void Main(string[] args)
     2         {
     3             HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
     4 
     5             using (var session = SessionFactory.OpenSession())
     6             {
     7                 var customer = CreateCustomer();
     8                 object custoemrId = session.Save(customer);
     9                 session.Flush();
    10             }
    11 
    12             Console.WriteLine("Completed");
    13             Console.ReadLine();
    14         }

    执行程序,再看数据库里插入的记录的包含了生成Customer对象时设置的Address信息。

  • 相关阅读:
    为什么要把MySQL的binlog格式修改为row
    面试官:你知道大事务会带来什么问题以及如何解决么?
    TCP三次握手、四次挥手、滑动窗口、流量控制
    SpringCloud Gateway拦截器遇到的小坑汇总
    Zipkin客户端链路追踪源码解析
    Hystrix失败处理逻辑解析
    Feign自动装配原理
    SpringCloud服务调用源码解析汇总
    Zipkin架构简介
    C#+Selenium抓取百度搜索结果前100网址
  • 原文地址:https://www.cnblogs.com/uncle_danny/p/5648221.html
Copyright © 2011-2022 走看看