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 

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

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

  • 相关阅读:
    对生产稳定的一些思考
    tsar指标解释
    tsar采集nginx指标
    Nginx如何处理一个连接
    Java : 如何更优雅的设计异常
    MySql的索引实现
    IntelliJ Idea 常用配置
    ICSharpCode.SharpZipLib.dll 压缩、解压Zip文件 附源码
    Java BigDecimal使用
    社交系统中用户好友关系数据库设计
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1539914.html
Copyright © 2011-2022 走看看