涤生之Enjoy code

General principles of programmer

导航

Nhibernate继承类的写法

继承有三种实现方法即 每个类一张表;每具体类一张表;所有类一张表。

每类一张表,采用连接的写法,所有类引用其父类,采用One2One/Many2One方法引用.

每个具体类一张表,其实就是单表的写法。

所有类一张表,写法如下。

试验环境:Bhb为主类, ExpenseBhb、KindBhb为子类。在数据库中就是通过Kind列来区分的。本示例中,子类未增加任何属性或行为。

其实可以这样理解,以前我一直考虑的编号表该如何处理的问题。

所有类保存在一张表中,则所有类的信息存储在一个Hbm.xml中

Hbm.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

 

  <class name="NHibernateStudy.Domain.Bhb, NHibernateStudy.Domain" table="TBL_BHB"

     lazy="false">

    <id name="Id" column="ID" type="Guid"

        unsaved-value="00000000-0000-0000-0000-000000000000">

      <generator class="guid" />

    </id>

    <discriminator column="KIND" type="String" length="50"/>

……

    <subclass name="NHibernateStudy.Domain.ExpenseBhb, NHibernateStudy.Domain" discriminator-value="费用"></subclass>

    <subclass name="NHibernateStudy.Domain.KindBhb, NHibernateStudy.Domain" discriminator-value="类别"></subclass>

  </class>

 

</hibernate-mapping>

 

注意其中两点是:

1) discriminator标志出表中是哪个列区分子类的

2) subclass中的discriminator-value,标志出该子类在表中存储在“区分列”中的值

 

.cs

ExpenseBhb、KindBhb要继承Bhb

 

编译错误

对于这种所有类放在一张表中的,需要将其公开属性设置为Virtual

 

调用代码如下:

protected void Button3_Click(object sender, EventArgs e)

    {

        //------费用编号表---Begin-----

        ExpenseBhb expensebhbTmp = new ExpenseBhb();

        expensebhbTmp.Number = 1;

        expensebhbTmp.Name = "营销费用";

 

        BhbDetail bhbdetailTmp = new BhbDetail();

        bhbdetailTmp.LastChangePerson = "juanWang";

        bhbdetailTmp.Bhb = expensebhbTmp;

 

……

        //------费用编号表---End--------

 

        //------类型编号表--Begin-----

        KindBhb kindbhb1 = new KindBhb();

        kindbhb1.Number = 1;

        kindbhb1.Name = "鸟类";

……

        //------类型编号表--End-------

 

        string sTmp = "Congratulate, We are succeed!";

        ISession session = Sessions.GetSession();

        ITransaction trans = session.BeginTransaction();

 

        try

        {

            session.Save(bhbdetailTmp);

            session.Save(bhbdetailTmp1);

            session.Save(kindbhb1);

            session.Save(kindbhb2);

            trans.Commit();

        }

        catch

        {

           
            trans.Rollback();
            sTmp = "Sorry, Please try again!";

        }

        finally

        {

            session.Close();

        }

 

        this.TbxHello.Text = sTmp;

       

    }

posted on 2007-07-19 16:48  涤生  阅读(1013)  评论(0编辑  收藏  举报