前语:

在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>

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

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

  1. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  2. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  3. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  4. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  5. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  7. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  8. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置

    1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...

  9. MyBatis的关联关系 一对一 一对多 多对多

    一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...

随机推荐

  1. RabbitMQ消息队列(二):"Hello, World"[转]

    2. Sending 第一个program send.cs:发送Hello world 到queue.正如我们在上篇文章提到的,你程序的第9行就是建立连接,第12行就是创建channel,第14行创建 ...

  2. oracle11g本地可以访问但局域网无法访问

    问题描述,现在有两台电脑 A 和 B : 1)电脑 A 上有 Oracle11G服务端: ip地址 192.168.1.198; 端口1521: 2)电脑 A 本机连接数据库正常,可以登录及操作等: ...

  3. ArcMap导入数据到ArcSDE报000597或者000224的错误

    这两天碰到不同用户提出的不同的问题,可是分析之后发现导致该问题的解决办法是同一个原因. -------------------------------------------------------- ...

  4. winform dataGridView DataGridViewComboBoxColumn 下拉框事件

    有一个dataGridView ,有一列是DataGridViewComboBoxColumn .用动态绑定,在绑定数据的时候.我们也给这一列绑定数据 在dataGridView的RowsAdded事 ...

  5. java jsch 登录linux系统避免手动输入Yes 或Always

    java jsch方法 登录linux系统, 要手动输入Yes No Always The host 10.202.84.7 is currently unknown to the system Th ...

  6. 在 IE 浏览器中,使用 bootstrap 使得页面滚动条浮动显示,自动隐藏,自动消失

    貌似是从 IE10 开始?为了触屏操作优化浏览器的内容显示,IE 浏览器提供了一种可以浮动显示,自动隐藏的滚动条样式,但是这个样式会在某些情况下造成一些困扰,比如下图... 其实默认情况下,桌面版的 ...

  7. C++第12周(春)项目2 - &quot;双肩挑&quot;教师

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目2 - 教师兼干部类](第11章习题9) ...

  8. [hihoCoder] #1122 : 二分图二•二分图最大匹配之匈牙利算法

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了.因为过年时间并不是很长,所以姑姑希望能够尽可 ...

  9. Learning Django: the hard way (1)

    Learning Django: the hard way (1) What does "runserver" do? Django provides a light-weight ...

  10. [na]mail收发过程

    以前老记不住这smtp和pop3谁收谁发. 简单邮件传输协议(SMTP),用来发送或中转发出的电子邮件,       占用tcp 25端口. 第三版邮局协议(POP3),用于将服务器上把邮件存储到本地 ...