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>

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

 

时间: 2024-09-28 18:25:09

Nhibernate 一对一,一对多,多对多 成功映射的相关文章

Nhibernate一对一关系映射概述

现有两个表:user(用户)和Blog(设置表),它们之间的关系正如我所说的是一对一的关系.现在我们来映射这两个文件: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MyMvc4Project.Models" assembly="MyMv

hibernate的多对一,一对多,多对多,一对一怎么理解?

问题描述 hibernate的多对一,一对多,多对多,一对一怎么理解? 是多个字段对应一个字段,一个字段对应多个字段,多个字段对应多个字段?还是多个对象对应一个对象,一个对象对应多个对象,多个对象对应多个对象. 在一对一的表中为什么是有外键的要设计成many-to-one?无外键的设计成non-to-one? 解决方案 就是字面意思,一个key可以对应另一张表的多个字段,就好像身份对应城市一样

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理         在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射.        在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之

【hibernate框架】一对多(多对一)双向CRUD-Cascade1

下面对一对多(多对一)的关联关系的CRUD进行测试. 这里用的是注解Annotation User.java: package cn.edu.hpu.one2many; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.T

一口一口吃掉Hibernate(六)——多对多关联映射

       今天来说说Hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种.        首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就是典型的多对多关联的例子.而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据.而双向关联映射则是A,B两端都可以操作另一端的数据.       先说单向关联映射,实体类如下: /** * 学生类 * @author Longxuan * */ public c

请教一个问题,hibernate多对一单向映射

问题描述 员工类:Staff.java部门类:Dept.java用的是struts2+hibernate.员工类和部门类是多对一单向映射,部门类有一个属性部门人数num.现在的问题是:当我新增或者删除一个员工时,部门类的num属性如何更新.新手请教,谢谢~ 解决方案 解决方案二:这个问题,与hibernate本身无关的吧,是你自身的业务逻辑而已,员工更新时,你通过java程序,或数据库编程的方式,就可以实现部门人数更新的了.解决方案三:1.用数据库触发器2.自己写程序逻辑解决方案四:在添加员工后

Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多

hibernate5(11)注解映射[3]一对多多对一双向关联

在上两篇文章里,我们详细地分别讲解了一对多和多对一的单向关联配置的具体属性含义,在这一篇文章里,我们完成两者的的整合建立双向关联. 在实际的博客网站中,我们可能需要根据文章读取作者(用户)信息,但肯定也要让用户能获取自己的文章信息,针对这种需求,我们可以建立文章(多)对用户(一)的双向关联映射. 下面先看实例映射配置文件: /********************一方配置User********************/ @Entity//声明当前类为hibernate映射到数据库中的实体类

Nhibernate 一对一关系映射(主键映射)

参考:点击这里 妈的,搞了一天了,终于可以了,现在总结下,以防下次再出现这样痛苦的问题了,有两个表:user(用户)和Blog(设置表),它们之间的关系正如我所说的是一对一的关系.现在我们来映射这两个文件: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="My