NHibernate Cookbook 学习笔记 2 Creating class hierarchy mappings

来源:互联网 发布:新华三大数据招聘 编辑:程序博客网 时间:2024/06/09 18:58

这一节来看看在NH中是怎么样来表示继承体系的

先来定义2个类,第一个是Book类,继承自product类:

namespace NStudy.core {    public class Book : Product {        public virtual string ISBN { get; set; }        public virtual string Author { get; set; }    }}


第2个是Movie类,继承自product类:

namespace NStudy.core {    public class Product :Entity{        public virtual string Name { get; set; }        public virtual string Description { get; set; }        public virtual decimal UnitPrice { get; set; }    }}


1.第一种方式是,所有的继承体系都体现在一张数据库表中,比如下面的这张 表

配置方式如下:
Product.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"    assembly="NStudy.core"    namespace="NStudy.core">    <class name="Product">        <id name="Id">            <generator class="guid.comb" />        </id>        <discriminator column="ProductType" />        <natural-id mutable="true">            <property name="Name" not-null="true" />        </natural-id>        <property name="Description" />        <property name="UnitPrice" not-null="true" />    </class></hibernate-mapping>


 

注意
<discriminator column="ProductType" />
    <natural-id mutable="true">
      <property name="Name" not-null="true" />
    </natural-id>
这2行的作用discriminator 用来区分此条数据记录的类型,通常存的数据为NStudy.core.Product,这样的全称,<natural-id mutable="true">是指定一个自然键,同时这个支持修改的自然键。

Book.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"    assembly="NStudy.core"    namespace="NStudy.core">  <subclass name="Book" extends="Product">    <property name="Author"/>    <property name="ISBN"/>  </subclass></hibernate-mapping>


Movie.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core">    <subclass name="Movie" extends="Product">        <property name="Director" />    </subclass></hibernate-mapping>


 

注意像下面这样的写法,就映射成上面的那张数据表:
 <subclass name="Book" extends="Product">
    <property name="Author"/>
    <property name="ISBN"/>
  </subclass>

值得注意的是,这种方式,一定要注意某些值不能设置为空:比如Author,ISBN,因为在Movie中没有这样的字段,所以不能设置为不允许空,因为它本来就是空。

2.上面这种方式,个人觉得不太好,下面这种会好一点:

稍稍修改一下配置文件,如下面所示:
Movie.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"    assembly="NStudy.core"    namespace="NStudy.core">  <joined-subclass name="Movie" extends="Product">    <key column="Id" />    <property name="Director" />  </joined-subclass></hibernate-mapping>


 

注意变化: <joined-subclass name="Movie" extends="Product">,这样NH做查询Product的时候,使用的join查询

3.还有最后一种方式,如下:

配置文件如下:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"    assembly="NStudy.core"    namespace="NStudy.core">  <union-subclass name="Movie" extends="Product">    <property name="Director" />  </union-subclass></hibernate-mapping>


这样如果NH查找product数据,则会用unions的方法来查询。

原创粉丝点击