zoukankan      html  css  js  c++  java
  • Nhibernate 一对一,一对多,多对多 成功映射

    前语:

    在Nhibernate xml 的文件配置上,一对一和多对多的配置比较简单,容易出错的反而是一对多(多对一)上。

    1、一对一关联关系的映射:

    <one-to-one
                    name="propertyName"
                    class="ClassName"
                    cascade="cascade_style"
                    constrained="true|false"
                    fetch="join|select" 
                    property-ref="propertyNameFromAssociatedClass"
                    access="field|property|ClassName"
                    formula="any sql expression"
                    lazy="true|proxy|false"
                    entity-name="EntityName"
                    node="element-name|@attribute-name|element/@attribute|."
                    embed-xml="true|false"
    />    
    序号 属性 含义和作用 必须 默认值
    1
    name
    映射类属性的名字 Y  
    2
    class
    映射的目标类。也就是与这个属性相关联的是哪个类 N  
    3
    cascade

    操作时的级联关系 。这个属性的可选值有:

      all--所有的操作均进行级联操作。

      none--所有操作均不进行级联操作

      save-update--在执行 save 和 update 时进行级联操作

      delete--在执行delete时进行级联操作

    N  
    4
    constrained
    表明当前类对应的表与被关联的表之间是否存在着外键约束。这将影响级联操作的顺序 N false
    5
    fetch

    设置抓取数据的策略。这个属性的可选值有:

      join--外连接抓取

      select--序列选择抓取

    N  
    6
    property-ref
    指定关联类的属性名,这个属性将会和本类的主键相对应 N 关键类的主键
    7
    access
    Hibernate 访问这个属性的策略 N property
    8
    formula

    绝大多数一对一的关联都指向其实体的主键。在一些少见的情况中,可能会指向其他的

    一个或多个字段,或者是一个表达式,在这些情况下,可以用一个sql公式来表示

    N  
    9
    lazy

    指定对于此关联对象是否使用延迟加载的策略。这个属性的可选值有:

      proxy--通过代理进行关联

      true--此关联对象采用延迟加载,在该实例变量第一次被访问时抓取(需要运行时

    字节翃的增强)

      false--此关联对象不采用延迟加载。注意,如果constrained="false",则不能

    使用代理,hibernate会采取预先抓取

    N proxy
    10
    entity-name
    被关联类的实体名 N  

     

     

    例如,A和B之间是一对一的关系,那么反过来B和A之间的关系也是一对一的。需要在这两个实体的映射文件中都进行

    相应的配置。这样,才能完整地表示这两个对象之间的关系。

    例如,对于Employee和Person进行主键一对一关联。首先需要在Employee对象的配置文件中定义到Person对象的关联:

    <one-to-one name="person" class="Person">

    然后还需要在Person对象的配置文件中定义到Employee对象的关联:

    <one-to-one name="employee" class="Employee" constrained="true">

    另外,为了确保两个对象的主键值是相等的,在定义主键的时候可以使用名称为 foreign 的Hibernate 标识符生成策略来实现这一目的。

    Person对象主键字段的映射信息的配置方法如下所示:

    <id name="id' column="ID">
                <generator class="foreign">
                            <param name="property">employee</param>
                </generator>
    </id>

    2、一对多(双向)关联关系的映射:

    <one-to-many
                    class="ClassName"
                    not-found="ignore|exception"
                    entity-name="EntityName"
                    node="element-name"
                    embed-xml="true|false"
    />        
    序号 属性 含义和作用 必须 默认值
    1 class 关联的目标类 Y  
    2 not-found 指名若关联的对象不存在,该如何处理 N Exception
    3 entity-name 被关联的类的实体名,作为class的替代 N  

     

     

     

     

    <set name="telephones" cascade="all" table="Telephones">
            <key column="User_Id"/>
            <one-to-many class="Telephones"/>
    </set>       

    在通常情况下,要将一对多的关联关系配置为双向,这样可以方便地从任意一方进行数据的维护工作,同时也可以解决上面所提到的问题。

    2、多对一(双向)关联关系的映射:

    通常情况下,关联关系的主控方设置为“多”的这一方,这样就可避免需要在“多”的一方的关联字段中先插入空值的情况出现。

      多对一的关联关系需要在“多”的这一方使用<many-to-one>来进行配置,配置的方法如下:

    <many-to-one name="user" class="User" column="User_Id" />

    另外,为了使“多”的这一方变为主控方,还需要在配置“一”的一方增加“inverse=true”的配置(set的属性)。

    在对象之间的关联关系中,“inverse='false'” 的一方变为主控方,由它来负责维护对象之间的关联关系。

    3、多对多关联关系的映射:

    <many-to-many
                    column="column_Name"
                    class="ClassName"               
                    fetch="join|select"                
                    lazy="true|proxy|false"
                    not-found="ignore|exception"
                    entity-name="EntityName"
                    formula="any sql expression"
    /> 
    序号 属性 含义和作用 必须 默认值
    1
    column
    中间关联表中映射到关联目标表的关联字段 Y  
    2
    class
    关联的目标类 Y  
    3
    fetch

    设置抓取数据的策略。这个属性的可选值有:

      join--外连接抓取

      select--序列选择抓取

    N select
    4
    lazy

    指定对于此关联对象是否使用延迟加载的策略。这个属性的可选值有:

      proxy--通过代理进行关联

      true--此关联对象采用延迟加载,在该实例变量第一次被访问时抓取(需要运行时

    字节翃的增强)

      false--此关联对象不采用延迟加载。注意,如果constrained="false",则不能

    使用代理,hibernate会采取预先抓取

    N  
    5
    not-found

    指名若关联的对象不存在,该如何处理。这个属性的可能取值有:

      exception--产生一个异常

      ignore--对于不存在的应用将关联到Null

    N exception
    6
    entity-name
    被关联类的实体名 N  
    7
    formula

    绝大多数的关联的关联都指向其实体的主键。在一些少见的情况中,可能会指向其它的一个或多个字段,或者是一个

    表达式,这些情况下,可以用一个sql公式来表示

    N  

    在开发中经常遇到的用户(User)和角色(Role)的关系就是多对多的关系。一个用户可以拥有多个角色,同时一个角色又可以被很多的

    用户所拥有。那么在描述这两个对象之间的关系时就需要建立一个中间表User_Role来确立它们之间的关系。

    首先,需要在其中一个对象(例如,User)中配置一个多对多的关联,如下所示:

    <set
            name="roles"
            table="User_Role"
            inverse="true"
            cascade="save-update"
            <key column="Id" />
            <many-to-many column="Role_Id" class="Role">
    /set>

    同样,在另一个对象(例如,Role)中需要进行如下配置:

    <set
            name="users"
            table="User_Role"
            cascade="save-update"
            <key column="Id" />
            <many-to-many column="User_Id" class="User">
    /set>

    在这里还是要再次提醒大家,对象之间的关联关系是双方向的,在配置的时候通常需要进行双向配置

  • 相关阅读:
    iOS中点击按钮复制指定内容
    iOS开发中,获取图片之后保存或下载到本地相册中
    This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value
    ios中友盟集成好使用总结
    ios中仿蚂蚁森林动画效果
    window frida安装
    Android_server提示端口被占用
    Android stdio Apktool源码编译
    Android ooVoo Apk附件关联分析
    cocos2d-x-2.2.6 project-creator文件夹下python.bat
  • 原文地址:https://www.cnblogs.com/zhangwei595806165/p/3552285.html
Copyright © 2011-2022 走看看