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

本文详细解析了数据模型中关联关系的概念,包括一对一、一对多及多对一等不同类型的关联,并探讨了主键与外键关联的区别及其在实际应用中的配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值