• 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 

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

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

  • 相关阅读:
    导包Scanner类---Java
    标准类组成---Java
    Educational Codeforces Round 54 (Rated for Div. 2) A. Minimizing the String
    [专题总结] 二分搜索专题
    [最大权森林] [POJ] 3723 Conscription
    [模板] 快读快写
    [模板] 常用数论 -> gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
    [模板] 堆 heap
    牛客小白月赛8 F-数列操作 (有序表)
    [模板] 字符串处理函数
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1539914.html
Copyright © 2020-2023  润新知