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

关联关系是可以反推的,比如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 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值