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>
在这里还是要再次提醒大家,对象之间的关联关系是双方向的,在配置的时候通常需要进行双向配置
Nhibernate 一对一,一对多,多对多 成功映射的更多相关文章
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- 使用NHibernate(7)-- 一对一 && 一对多 && 多对多
1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
- JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置
1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...
- MyBatis的关联关系 一对一 一对多 多对多
一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...
随机推荐
- RabbitMQ消息队列(二):"Hello, World"[转]
2. Sending 第一个program send.cs:发送Hello world 到queue.正如我们在上篇文章提到的,你程序的第9行就是建立连接,第12行就是创建channel,第14行创建 ...
- oracle11g本地可以访问但局域网无法访问
问题描述,现在有两台电脑 A 和 B : 1)电脑 A 上有 Oracle11G服务端: ip地址 192.168.1.198; 端口1521: 2)电脑 A 本机连接数据库正常,可以登录及操作等: ...
- ArcMap导入数据到ArcSDE报000597或者000224的错误
这两天碰到不同用户提出的不同的问题,可是分析之后发现导致该问题的解决办法是同一个原因. -------------------------------------------------------- ...
- winform dataGridView DataGridViewComboBoxColumn 下拉框事件
有一个dataGridView ,有一列是DataGridViewComboBoxColumn .用动态绑定,在绑定数据的时候.我们也给这一列绑定数据 在dataGridView的RowsAdded事 ...
- java jsch 登录linux系统避免手动输入Yes 或Always
java jsch方法 登录linux系统, 要手动输入Yes No Always The host 10.202.84.7 is currently unknown to the system Th ...
- 在 IE 浏览器中,使用 bootstrap 使得页面滚动条浮动显示,自动隐藏,自动消失
貌似是从 IE10 开始?为了触屏操作优化浏览器的内容显示,IE 浏览器提供了一种可以浮动显示,自动隐藏的滚动条样式,但是这个样式会在某些情况下造成一些困扰,比如下图... 其实默认情况下,桌面版的 ...
- C++第12周(春)项目2 - "双肩挑"教师
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目2 - 教师兼干部类](第11章习题9) ...
- [hihoCoder] #1122 : 二分图二•二分图最大匹配之匈牙利算法
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了.因为过年时间并不是很长,所以姑姑希望能够尽可 ...
- Learning Django: the hard way (1)
Learning Django: the hard way (1) What does "runserver" do? Django provides a light-weight ...
- [na]mail收发过程
以前老记不住这smtp和pop3谁收谁发. 简单邮件传输协议(SMTP),用来发送或中转发出的电子邮件, 占用tcp 25端口. 第三版邮局协议(POP3),用于将服务器上把邮件存储到本地 ...