POJOs如下:

Customer类------>customer表   Order类对应---------->orders表  customer(1)<--------------->(n)order

public class Customer
{
private String id;
private String username;
private String password;
private Timestamp registerTime;
private int age;
private Set<Order> orders = new HashSet<Order>(); /*setter and getter method*/
}

  

public class Order
{
private String id;
private String orderNumber;
private int balance;
private Customer customer; /*setter and getter method*/
}

  

Set集合映射:

Hibernate为集合映射提供了专用的标签元素,Set集合映射,就使用<set>标签表示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.suxiaolei.hibernate.pojos.Customer" table="customer">
<!-- 主键设置 -->
<id name="id" type="string">
<column name="id"></column>
<generator class="uuid"></generator>
</id> <!-- 属性设置 -->
<property name="username" column="username" type="string"></property>
<property name="password" column="password" type="string"></property>
<property name="age" column="age" type="integer"></property>
<property name="registerTime" column="register_time" type="timestamp"></property> <set name="orders" inverse="true" cascade="all">
<key column="customer_id"></key>
<one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
</set> </class>
</hibernate-mapping>

  <set>标签中的"name"属性表示customer对象中关系集合的属性名,"inverse"与"cascade"属性说明(参考这里)。在数据库中表示"一对多"的关系是通过外键关联的方式实现的,"多方"通过持有"一方"的主键值来确定关系,怎么持有"一方"的主键值?"多方"将使用一列来存储"一方"的主键值,然后将此列作为外键列参照"一方"的主键列。所以使用Hibernate开发时需要将两表的关系列(外键列)告诉Hibernate,<key column="customer_id"></key>就是完成这个工作的,Hibernate就能根据 "customer_id"列取出关联信息。例如:从customer表中取出一条记录后,Hibernate会根据该customer记录的主键值再从order表中查找"custom_id"列,取出值相等的记录,然后组装到Customer对象中的set集合属性中,反之亦然。因为取出来的记录(只是一些零碎的值,还没有组装成对象)需要存放到Set集合中,所以要告诉Hibernate在Set集合里面能放什么类型的数据。<one-to-many>这个标签就是完成这个工作的,"class"属性是指定这个这个Set集合里面元素的类型。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.suxiaolei.hibernate.pojos.Order" table="orders">
<id name="id" type="string">
<column name="id"></column>
<generator class="uuid"></generator>
</id> <property name="orderNumber" column="orderNumber" type="string"></property>
<property name="balance" column="balance" type="integer"></property> <many-to-one name="customer" class="com.suxiaolei.hibernate.pojos.Customer">
<column name="customer_id"></column>
</many-to-one>
</class>
</hibernate-mapping>

  

<many-to-one>标签是设置"一对多"关系中的"多方"的,name指定了哪一个属性是关系属性,"class"指定了关系属性的类型(也指定了与哪一个表关联), "column"属性是指定这个关联属性是按照"customer_id"列的值,在customer表中查询获得的。

测试:

tx = session.beginTransaction();

            /*
* 创建Customer对象,并设置其属性值
*/
Customer customer = new Customer();
customer.setUsername("zhangsan");
customer.setPassword("123456");
customer.setAge(22);
customer.setRegisterTime(new Timestamp(new Date().getTime())); /*
* 创建Order对象order1,并设置其属性值
*/
Order order1 = new Order();
order1.setOrderNumber("a1a2a3");
order1.setBalance(1000);
order1.setCustomer(customer); /*
* 创建Order对象order2,并设置其属性值
*/
Order order2 = new Order();
order2.setOrderNumber("d3d2d1");
order2.setBalance(670);
order2.setCustomer(customer); customer.getOrders().add(order1);
customer.getOrders().add(order2); session.saveOrUpdate(customer); tx.commit();

  

查看数据库的数据:

customer表:

orders表

可以看到数据被成功的插入到数据库中了,并且"custom_id"列(关系列)也正确赋值了。

List映射:

Hibernate为集合映射提供了专用的标签元素,List集合映射,就使用<list>标签表示:

 <list name="orders" inverse="false" cascade="all">
<key column="customer_id"></key>
<index column="customer_index" type="integer"></index>
<one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
</list>

  

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

查看数据库:

customer表:

orders表:

可以看到记录正确的插入到数据库中了,而且"custom_index"正确的表示出List的顺序。

Array(数组)映射:标签使用<array>其他与List基本一致。

Map映射:

Hibernate为集合映射提供了专用的标签元素,Map集合映射,就使用<map>标签表示:

 <map name="orders" inverse="false" cascade="all">
<key column="customer_id"></key>
<index column="order_key" type="string"></index>
<one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
</map>

  

Map映射中<index>标签,表示Map集合中的key值,记录在"order_key"列中,<one-to-many>表示Map集合中的vlaue。其他设置与上面一样。注意:"inverse"不要设置成"true"因为key值是customer对象维护的,而order不知道key的存在。

Bag映射:它是List与Set集合的结合,可以重复,但是无顺。使用List模拟Bag。设置类似Set,它也有专用标签<bag>。


总结

  在没有特殊要求下,最好使用Set集合,因为Set集合没有特殊信息需要"一方"自己维护,可以完全交给"多方"维护,能够提高性能,若需要记录数据的顺序可以使用List和Array映射,若需要key/value形式存储数据,可以使用Map映射。最后一点若集合放置的数据简单类型(原生类型、原生类型的包装类、String、Date之类的)在集合映射配置上稍有不同,<element>元素可以直接映射这些简单类型,其他配置与上述配置没什么不同。

Hibernate的集合映射(Set、List、Array、Map、Bag)的更多相关文章

  1. Hibernate的集合映射与sort、order-by属性

    [Hibernate]Hibernate的集合映射与sort.order-by属性 常用集合Set.List.Map,相信大家都很熟悉,面试中也会经常问.Set和List都继承了Collection接 ...

  2. Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)

    a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即 ...

  3. Hibernate笔记③--集合映射、组合映射、联合主键、查询案例

    lazy 懒加载 默认为proxy   继承映射 discriminant column="type" type="string"   集合映射 生成表的语句: ...

  4. hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇

    照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放: package com.joe.entity; import java.util.Map; publi ...

  5. hibernate简单集合映射和获取

    简单集合映射(可以直接获取) // javabean设计 public class User { private int userId; private String userName; // 一个用 ...

  6. 快速数组对象取值与数组映射新数组--array.map

    array.map(callback,[ thisObject]); 1.map方法的作用不难理解,“映射”嘛,也就是原数组被“映射”成对应新数组 a)array.map(()=>值); [1, ...

  7. hibernate的集合映射(详细笔记)

  8. Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)

    Set类型的使用: <hibernate-mapping package="cn.model"> <class name="Department&quo ...

  9. Hibernate征途(七)之复合主键映射和集合映射

    把这两种映射放到一起说,是因为这两种映射不像前面的复用型映射.数量和方向型映射那么分类鲜明,所以放到了这个“其他”里面. 复合主键映射 在关系模型中,复合主键和其他的主键方式没有很大区别,但是反映到对 ...

随机推荐

  1. MOS管体二极管的作用

    这里有两种解释: 1.mos管本身自带有寄生二极管,作用是防止VDD过压的情况下,烧坏mos管,因为在过压对MOS管造成破坏之前,二极管先反向击穿,将大电流直接到地,从而避免MOS管被烧坏. 2.防止 ...

  2. 【资料目录收藏】.NET开发必看资料53个 经典源码77个

    简单描述:为大家整理了下载中心.net资料,都是比较热的,好评率比较高的,做了一个可收藏的下载目录,希望大家喜欢~ 基于.net构架的留言板项目大全源码 http://down.51cto.com/z ...

  3. Web负载均衡的几种方式

    Web负载均衡的几种实现方式 摘要:负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用 ...

  4. Aircrack-ng官方文档翻译[中英对照]---Aireplay-ng

    Aircrack-ng官方文档翻译---Aireplay-ng[90%] Description[简介] Aireplay-ng is used to inject frames. Aireplay- ...

  5. JQuery replace 替换全部

    天在做写个程序时遇到需要替换的功能,可是一开始用jquery的replace时,发现只替换到第一个.最后没办法,只好用正则表达式来例如下面   re = new RegExp("{thisc ...

  6. JQuery为元素添加样式

    由于jquery支持css3,所有能很好的兼容很多浏览器,所以通过jquery来使用css样式比较好 为定义好的css样式可以调用元素的css方法添加样式 $("span").cs ...

  7. Word中表格内容被遮挡

    RT,输入内容后下面的主任签字会被遮挡,解决办法:选中整个表格右键,表格属性,行高值设置为最小值,然后设置允许跨页断行:有人说右键按内容调整表格也行,没试过............

  8. eMMC尺寸

    eMMC Physical Specifications主要有四种结构,pin角定义及功能上基本一致,主要是看应用平台的需求: AA:12mm*16mm 169Pin  AB:12mm*18mm 16 ...

  9. Knockout绑定audio的pause事件导致音频无法停止

    ...时间过得真快, 一晃4天已经过去了, 然而自己并没有动笔写什么. 自省. 看了看今天的工作, 感觉好像没什么可写的. 不禁在想是不是一天一篇有点儿难. 再一想, 这分明就是在给自己找理由. 就是 ...

  10. Is the Information Reliable?(差分约束)

    Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years a ...