NHibernate Step By Step(2)-继承映射

来源:互联网 发布:金融网络销售装美女 编辑:程序博客网 时间:2024/05/22 15:54

分三种

1.单表继承

既然是单表继承就需要一个键值来标识类别

  1. class以discriminator-value来标识类别
  2. discriminator 用以表示鉴别器的表字段
  3. 继承的类以subclass来标识
  4. 以extends来标识继承的类


(1)父类

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"><classname="NHibernate.Test.Subclass.SubclassBase, NHibernate.Test"table="one_tab"discriminator-value="SUPER" ><idname="Id"type="Int32"unsaved-value="0"column="joined_subclass_id"access="nosetter.camelcase-underscore"><generator class="native" /></id><discriminator column="disc_column" type="String" /><property name="TestLong" column="test_long" type="Int64" /><property name="TestString" column="test_string" type="String" /><property name="TestDateTime" column="test_date_time" type="DateTime" /></class></hibernate-mapping>

(2)子类

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"><subclassextends="NHibernate.Test.Subclass.SubclassBase, NHibernate.Test"name="NHibernate.Test.Subclass.SubclassOne, NHibernate.Test"discriminator-value="SUB"><property name="OneTestLong" column="one_test_long" type="Int64" /></subclass></hibernate-mapping>


(3)生成的数据库测试数据
image

看图更能理解意图

2.鉴别器

这里看一下鉴别器的使用,可以指定鉴别器的值,以辨别不同的类,如下:

多个类映射到同张表,Foo 类以Green标识,Baz 则具备了Color 属性,Foo可以说是Baz的特殊类别,都是通过配置文件来实现

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" namespace="NHibernate.Test.Subclass.EnumDiscriminator" assembly="NHibernate.Test"><class name="Foo" table="subclass_enumdiscriminator" discriminator-value="Green"><id name="Id" type="Int64"><generator class="assigned"/></id><discriminator column="Color" type="NHibernate.Test.Subclass.EnumDiscriminator.Colors, NHibernate.Test"/><subclass name="Bar" discriminator-value="Blue"/></class><class name="Baz" table="subclass_enumdiscriminator"><id name="Id" type="Int64"><generator class="assigned"/></id><property name="Color"/></class></hibernate-mapping>

测试数据
image

3.每个子类一张表(具备与父类有关联关系的)

映射文件

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"><class name="NHibernate.Test.JoinedSubclass.Person, NHibernate.Test" table="person" proxy="NHibernate.Test.JoinedSubclass.Person, NHibernate.Test"><id name="Id" type="Int32" unsaved-value="0" column="person_id" access="nosetter.camelcase-underscore"><generator class="native"/></id><property name="Name" column="name"/><property name="Sex" column="sex"/><component name="Address"><property name="Street"/><property name="Zip"/><property name="Country"/></component><joined-subclass name="NHibernate.Test.JoinedSubclass.Employee, NHibernate.Test" table="empl" proxy="NHibernate.Test.JoinedSubclass.Employee, NHibernate.Test"><key column="person_id"/><property name="Title" not-null="true" length="20"/><property name="Salary" type="Decimal(19,5)"/><many-to-one name="Manager"/></joined-subclass><joined-subclass name="NHibernate.Test.JoinedSubclass.Customer, NHibernate.Test" table="cust" proxy="NHibernate.Test.JoinedSubclass.Customer, NHibernate.Test"><key column="person_id"/><property name="Comments"/><many-to-one name="Salesperson"/></joined-subclass></class></hibernate-mapping>

生成表结构
image
image

 

4.无关联关系的继承表

即每张表都会生成父类的字段

<class name="Person" table="UPerson"><id name="id"column="person_id"unsaved-value="0"><generator class="hilo"/></id><property name="name"unique-key="NameUniqueKey"not-null="true"length="80"/><property name="sex"not-null="true"update="false"/><component name="address"><property name="address" index="AddressIndex"/><property name="zip" index="AddressIndex"/><property name="country"/></component><union-subclass name="Employee" table="UEmployee"><property name="title"not-null="true"length="20"/><property name="salary" /><many-to-one name="manager"/></union-subclass><union-subclass name="Customer" table="UCustomer"><property name="comments"/><many-to-one name="salesperson"/></union-subclass></class>

数据库表结构
image