Hibernate的集合映射与sort、order-by属性
【Hibernate】Hibernate的集合映射与sort、order-by属性
常用集合Set、List、Map,相信大家都很熟悉,面试中也会经常问。Set和List都继承了Collection接口,Set是无序不可重复的,不可以存储相同的元素;而Lsit是顺序存储的,可存储重复元素。Map不是继承Collection的,Map提供key到value的映射,Map也是不可重复的(key不可重复),一个Map中不能包含相同的key,每个key只能映射一个value。
持久化类的属性是集合时,要把它们存到数据库中,需要增设数据库表来完成映射工作。例如一个学生的教育背景可能不止一个,这个时候持久化类的属性是集合,这个时候数据库就需要再提供一张数据库表来存储。

由上图可以看出,集合的映射应该怎么写了。集合的映射大致一样,我们用Set的映射来详细说明。
<set name="education" table="student_education" order-by=" education DESC">
<key column="student_id"></key>
<element type="string" column="education"></element>
</set>
name属性是指对象的集合属性名,table属性是指集合表(数据库表)的名称,key子元素是指集合外键的列名,element子元素用来存放集合元素的列的信息,order-by属性是指查询数据库时指定order by 子句,这是在数据库中的排序。对于Set的排序,还有另外一个属性sort,它是在内存中排序的,默认是unsorted,sort还有其它两个值:natural和comparatorClass,当使用sort属性时,要求使用的是可以排序的Set,例如TreeSet等。
List的映射:
<list name="education" table="student_education">
<key column="student_id"></key>
<list-index column="list_id"></list-index>
<element type="string" column="education"></element>
</list>
List的映射与Set很相似,多了一个list-index子元素,是指定List的索引对应于集合表中的哪个字段。因为List是有序的,可以通过索引来取值。也正因为有序,所以不可以使用sort属性进行排序。
Map的映射:
<p><map name="education" table="student_education"></p><p> <keycolumn="student_id"></key></p><p> <map-keytype="string" column="map_key"></map-key></p><p> <element type="string"column="education"></element></p><p></map></p>
map-key子元素是指定Map的key值对应集合表中的哪个字段。
除了这3个常用的集合的映射,hibernate还提供了另外两种集合的映射:数组和Bag。数组性质跟List相似,但是数组的长度不可变;Bag也与List相似,但是它是无序可重复的。因此数组的映射与List基本一样:
<array name="education" table="student_education">
<key column="student_id"></key>
<list-index column="list_id"></list-index>
<element type="string" column="education"></element>
</array>
而Bag的映射就比List少一个list-index子元素:
<bag name="education" table="student_education">
<keycolumn="student_id"></key>
<elementtype="string" column="education"></element>
</bag>
注意:
使用集合属性时,一定要使用接口,而不能声明为具体实现类。因为经过session操作后,集合就变成hibernate自己的集合实现类。
最好再整理一次关于sort也order-by属性的使用:
由于Set与Map都是无序的,所以我们可以使用sort或者order-by属性对它们进行排序。sort是在内存中排序的,要求使用的Set与Map也是可排序的。这种排序方法不建议使用,使用较多的,排序也比较快的是使用order-by属性,直接在数据库中排序。
Hibernate的集合映射与sort、order-by属性的更多相关文章
- Hibernate的集合映射(Set、List、Array、Map、Bag)
POJOs如下: Customer类------>customer表 Order类对应---------->orders表 customer(1)<-------------- ...
- Hibernate笔记③--集合映射、组合映射、联合主键、查询案例
lazy 懒加载 默认为proxy 继承映射 discriminant column="type" type="string" 集合映射 生成表的语句: ...
- Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)
a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即 ...
- hibernate简单集合映射和获取
简单集合映射(可以直接获取) // javabean设计 public class User { private int userId; private String userName; // 一个用 ...
- hibernate的集合映射(详细笔记)
- Hibernate 对象关系映射文件
简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...
- (转)Hibernate框架基础——映射集合属性
http://blog.csdn.net/yerenyuan_pku/article/details/52745486 集合映射 集合属性大致有两种: 单纯的集合属性,如像List.Set或数组等集合 ...
- Hibernate征途(七)之复合主键映射和集合映射
把这两种映射放到一起说,是因为这两种映射不像前面的复用型映射.数量和方向型映射那么分类鲜明,所以放到了这个“其他”里面. 复合主键映射 在关系模型中,复合主键和其他的主键方式没有很大区别,但是反映到对 ...
- HIbernate学习笔记(七) hibernate中的集合映射和继承映射
九. 集合映射 1. Set 2. List a) @OrderBy 注意:List与Set注解是一样的,就是把Set更改为List就可以了 private List< ...
随机推荐
- 20150608_Andriod 发布问题处理
参考地址: http://blog.csdn.net/cxc19890214/article/details/39120415 问题:当我们开发完成一个Android应用程序后,在发布该应用程序之前必 ...
- ie调试工具
调试ie6真是疯掉了,要到一个包,类firbug,js写的不错. 链接:http://pan.baidu.com/s/1c2JOs0K 密码:fea8
- Mysql-学习笔记(==》连接查询_高级查询五)
CREATE TABLE t( tid INT UNSIGNED NOT NULL AUTO_INCREMENT, tname VARCHAR(30), PRIMARY KEY (tid))ENGIN ...
- [转]Windows8下设置VS默认启动方式为管理员启动
在Windows7下通常使用修改属性的方式:在任意快捷方式上右击,选择属性,选择高级,选择以管理员身份启动: 在Windows8下如上设置后,右击直接打开项目的话是不会以管理员身份启动的,这里用比较h ...
- Cpdetector编码识别
概述 浏览器在打开一个网页时,首要任务是判断网页的编码格式,然后采用合适的编码进行解析:我们常用的文本编辑器在打开文档时同样需要判断文档的编码进行相应的解析.这涉及到的技术就是编码甄别,下面我们介绍一 ...
- 你不知道的This和Class
Oh no....我的This又丢失了??? 为什么我用Class'实例化'出来的对象会相互影响??? ####这些问题都是因为JS的运行机制造成的.在JS中所有的一切都是对象,而this是对象的一个 ...
- 修改ftp密码
1.运行cmd2.在DOS窗口中输入FTP 127.0.0.13.出现用户名输入提示“user”,键入用户名,按回车4.出现输入密码提示:“Password”,键入密码后按回车登录到服务器中5.在ft ...
- Dev gridview新增一行自动获得焦点并打开编辑模式
1.gridview添加一行自动获得焦点实现方式: 关键代码: GarsonZhang dt.Rows.Add("1", "2"); gridView1.Foc ...
- JS中 window.location 与window.location.href的区别
疑惑:window.location='url' 与window.lcoation.href='url'效果一样,都会跳转到新页面,区别在哪?查得的资料如下: 1:window.location是页 ...
- CANopen笔记2
PDO 过程数据对象用于在节点之间传送过程数据,如I/O模块I/O状态读取和设定,模拟量采集和模拟量输出等等,协议考虑从机硬件限制最多支持4组PDO,每组包含一个RPDO和一个TPDO.The Gol ...