NHibernate Cookbook 学习笔记 2 Creating class hierarchy mappings

这一节来看看在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的方法来查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值