zoukankan      html  css  js  c++  java
  • 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 

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

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

  • 相关阅读:
    一个Electron的设计缺陷及应对方案
    如何点击穿透Electron不规则窗体的透明区域
    Electron团队为什么要干掉remote模块
    Clickhouse 单机双实例
    Kafka安全认证SASL/PLAIN
    Syslog的使用
    Kafka Consumer
    Kafka Producer客户端
    Kafka客户端操作
    springboot集成flyway实践
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1539914.html
Copyright © 2011-2022 走看看