第九章 关系映射 集合关联映射

简介: <p align="LEFT" style="margin-bottom:0cm"><br></p> <p style="margin-bottom:0cm">基本上所有集合关联映射都是在一对多<span style="font-family:Times New Roman,serif"><span style="font-family:Courier New,serif">,</spa


基本上所有集合关联映射都是在一对多,多对多操作的时候使用。


1set

我们之前在做一对多操作的时候,多的一方就是一个set.

一对多的例子:http://blog.csdn.net/p_3er/article/details/9036921


实体类中:

private Set<Employee> employees; 



对应的映射文件:

<set name="employees" inverse="false" cascade="all">  
            <key column="department_id"></key>  
            <one-to-many class="cn.framelife.hibernate.entity.Employee"/>  
        </set>  


2、有序的List

数据库的employee表中多了一个e_index字段,用以表示顺序。


实体类中:

private List<Employee> employees;


对应的映射文件:

<list name="employees" cascade="save-update">
       		<key column="department_id"></key>
       		<index column="e_index"></index>
       		<one-to-many class="cn.framelife.hibernate.entity.Employee"/>
       </list>



增加操作与set一样

        List集合是有顺序的,"index"标签,是用于记录顺序,List的顺序将表现在"e_index"列上,其余设置,与Set集合类似。注意:List映射中"inverse"中的值不能设置为"true",不然,"e_index "的列值将不会被赋值。



3、无序的List

数据库的employee表中无e_index字段。无序的ListSet使用起来是一样的。只是无序的List使用的映射标签是<bag>


实体类中:

privateList<Employee> employees;



对应的映射文件:

<bag name="employees" cascade="all">
       		<key column="department_id"></key>
       		<one-to-many class="cn.framelife.hibernate.entity.Employee"/>
       </bag>


增加操作与set一样



4Map

表设计与set的时候一样。

实体类中:

privateMap<String, Employee> employees;

这里的键值对中的键应该是唯一的(不重复),我们设置为员工的名字。



对应的映射文件:

<map name="employees" cascade="all">
        	<key column="department_id"></key>
        	<map-key type="string" column="name"></map-key>
        	<one-to-many class="cn.framelife.hibernate.entity.Employee"/>
      </map>


增加操作:

transaction = session.beginTransaction();
			Department department = new Department();
			department.setName("m");
			
			Map<String, Employee> employees = new HashMap<String, Employee>();
			for(int i = 0;i < 10; i++){
				Employee employee = new Employee();
				employee.setName("m"+i);
				employees.put(employee.getName(), employee);
			}
			
			department.setEmployees(employees);
			session.save(department);
			
			transaction.commit();



5、注意

5.1HashMap<String,Employee> employees = newHashMap<String,Employee>();

这样子的写法在Java中语法上和使用上是没有任何问题的。

因为懒加载的需要,我们使用所有集合对象都应该用接口来定义。而且在我们写程序的过程中也尽可能得使用接口。


5.2cascade缺省为不级联。

cascade的值有:none,all,save-update,delete...

many-to-one many-to-many一般不设置级联

one-to-one one-to-many可设置级联


5.3inverse是否要放弃维护关联关系

true为放弃,false为不放弃(缺省)

一般不设置放弃





目录
相关文章
|
JavaScript Linux Shell
一款国内SSH终端工具
Windows系统中,连接linux ssh的管理终端常用好用的软件无疑是Xshell/SecureCRT/PUTTY三款终端软件。但这三款终端无法实现跨平台使用,以及部分软件需要昂贵的授权费用才能使用。现作者给大家推荐一款基于Electron + Vue的跨平台(windows/linux/macos)终端软件NxShell
一款国内SSH终端工具
|
SQL 分布式计算 Spark
如何在Spark中实现Count Distinct重聚合
Count Distinct是SQL查询中经常使用的聚合统计方式,用于计算非重复结果的数目。由于需要去除重复结果,Count Distinct的计算通常非常耗时。本文主要介绍在Spark中如何基于重聚合实现交互式响应的COUNT DISTINCT支持。
|
消息中间件 运维 安全
大搜车:云上多地域高可用消息系统的构建
大搜车利用云上MQTT+消息队列RocketMQ+全球消息路由+消息队列Kafka构建了完整的云上消息系统。
3706 110
大搜车:云上多地域高可用消息系统的构建
|
搜索推荐
恒生电子联合蚂蚁金服、阿里云,发布新一代技术平台
5月16日,恒生电子联合蚂蚁金服、阿里云发布“新一代分布式服务开发平台”。
3511 0
|
图形学
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具
583 0
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具
|
存储 文字识别 机器人
ABBYY15简体中文汉化包OCR文字识别下载教程
自ABBYY FineReader15新版发布以来,一直好评不断,作为市场领先的OCR文字识别软件可快速方便地将扫描纸质文档、PDF文件和数码相机的图像转换成可编辑、可搜索信息。这也使很多小伙伴开始体验和使用该软件,小编亲自测试安装ABBYY FineReader 15版本,并整理教程,有需要的可以参考下。
811 0
|
SQL 分布式计算 Java
spark task过多导致任务运行过慢甚至超时
spark task过多导致任务运行过慢甚至超时
1087 0
spark task过多导致任务运行过慢甚至超时
|
数据采集 数据可视化 BI
一份可视化特征图的代码
本文给大家分享一份我用的特征图可视化代码。 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、最新论文解读、各种技术教程、CV招聘信息发布等。关注公众号可邀请加入免费版的知识星球和技术交流群。
一份可视化特征图的代码
|
Python Windows
tesseract库的安装与使用及在python中使用
tesseract库的安装与使用及在python中使用
1755 0
tesseract库的安装与使用及在python中使用
|
设计模式 算法 NoSQL
后端必备的200本书,一次性给你!
这段时间,我给大家整理一份后端必读书籍(电子版),一共200多本,大家一起来看下,文末有获取方式
后端必备的200本书,一次性给你!