代码改变世界

NHibernate Step By Step(6)-关联关系

2009-08-05 21:45  Clingingboy  阅读(657)  评论(0编辑  收藏  举报

关联关系是可以反推的,比如Person和Address,一家人可以住在同个地址,但一个人也可以同时拥有都个地址,如家庭地址,工作地址。概念并不复杂,反而被未说清楚的示例搞晕了。

关联分为单向与双向,即两者之间的关系存在一种或两种
下面的为双向关联,去掉其中一个关联即是单向了.(一个问题有多个答案)

<class name="Question" table="QUESTION">
    <id name="Id" type="long">
        <generator class="assigned"/>
    </id>
    <set name="Answers" inverse="true">
        <key column="Question"/>
        <one-to-many class="Answer"/>
    </set>
</class>
//一对多 <
class name="Answer" table="ANSWER"> <id name="Id" type="long"> <generator class="assigned"/> </id> <many-to-one name="Question" not-null="true" /> </class>

//多对一


改为一对一

<class name="Question" table="QUESTION">
    <id name="Id" type="long">
  <generator class="foreign">
    <param name="property">Answer</param>
  </generator>
    </id>

<one-to-one name="Answer" constrained="true"/>
</class>

<class name="Answer" table="ANSWER">
    <id name="Id" type="long">
        <generator class="native"/>
    </id>
</class>

以上配置为无连接表(即只有两张表),配置成有连接表更加灵活

image 

有连接表的配置

指定unique为true,并指定set的table

一对多

<class name="Question" table="QUESTION">
    <id name="Id" type="long">
  <generator class="native">
    
  </generator>
    </id>
<set name="Answers"  table="QuestionANSWER">
  <key column="Question"/>
  <many-to-many column="AnswerId"
       unique="true"
       class="Answer"/>
</set>
   
</class>

<class name="Answer" table="ANSWER">
    <id name="Id" type="long">
        <generator class="native"/>
    </id>
</class>

以上配置将会生成一个关联表

image

多对一

<class name="Question" table="QUESTION">
        <id name="Id" type="long">
      <generator class="native">
        
      </generator>
        </id>

   
    </class>

    <class name="Answer" table="ANSWER">
        <id name="Id" type="long">
            <generator class="native"/>
        </id>
    <join table="AnswerQuestion"
      optional="true">
      <key column="AnswerId" unique="true"/>
      <many-to-one name="Question"
          column="questionId"
          not-null="true"/>
    </join>

  </class>

生成表结构

image

还有关联的一对一与多对多.

双向关联

一对多,多对一即典型的父子关系

即上面的第一种关系

<class name="Question" table="QUESTION">
    <id name="Id" type="long">
        <generator class="assigned"/>
    </id>
    <set name="Answers" inverse="true">
        <key column="Question"/>
        <one-to-many class="Answer"/>
    </set>
</class>

<class name="Answer" table="ANSWER">
    <id name="Id" type="long">
        <generator class="assigned"/>
    </id>
    <many-to-one name="Question" not-null="true" />
</class>


一般分为主键和外键关联,可以理解为主键关联为单键关联,外键关联是多键关联

此为外键关联

image

主键关联

image 

以上两张图为一对一的关系

双向关联有连接表,这里不写了。。。但需要注意配置细节