【Hibernate步步为营】--最后的集合映射
上篇文章具体讨论了组合对象映射的原理。它事实上指的是怎样将对象模型中的组合关系映射到关系模型中,它是通过使用Hibernate提供的<component>标签来实现的,并须要在该标签中加入相应组合对象的属性,有关组合对象的映射请查看笔者的上篇文章。该篇文章来具体讨论下集合的映射关系。Java的集合有四种各自是Set、Map、List和普通集合,在开发时往往须要将这些集合转化为相应的关系模型,这样的集合映射的实现过程就是我们今天要讨论的话题。
一、集合映射
1.1 集合小介
集合映射也是主要的映射。但在开发过程中不会经经常使用到,所以不须要深刻了解。仅仅须要理解主要的用法就可以,等在开发过程中遇到了这样的问题时可以查询到解决方法就行了。
相应集合映射它事实上是指将java中的集合映射到相应的表中,是一种集合对象的映射。在java中有四种类型的集合。各自是Set、Map、List还有普通的数组,它们之间有非常大的差别:
Set,不能够有反复的对象,对象是无序的;
List,能够与反复的对象,对象之间有顺序;
Map,它是键值成对出现的。
数组,能够反复,对象之间有顺序。
它们之间的差别决定了在开发时使用哪种集合,通常在开发时会使用Set,它内部的对象是无需的。并能够使用迭代器获取内部对象。这几种集合想要映射到对应的关系模型的话就必须使用Hibernate提供的映射标签,<set>、<list>、<map>、<array>。
1.2 映射小介
继续讨论集合映射的关系模型,集合映射是指一个对象相应着还有一个对象集合。在保存时Hibernate会把数据集合保存到相应的表中,并依照自己分配的id把数据保存到数据表中,假设单独为集合分配了新表。那么会将id分配给集合表的id,那么相应的关系表例如以下图:
1.3 类文件
集合映射是怎样通过代码实现的,接下来详细分析。这里把全部的集合封存到一个类中,这个类我们称之为CollectionMapping.java,那么它相应的内部代码例如以下:
package com.hibernate; import java.util.List;
import java.util.Map;
import java.util.Set; @SuppressWarnings("rawtypes")
public class CollectionMapping { //id
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} //名字
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} //Set集合
private Set setValues;
public Set getSetValues() {
return setValues;
}
public void setSetValues(Set setValues) {
this.setValues = setValues;
} //List集合
private List listValues;
public List getListValues() {
return listValues;
}
public void setListValues(List listValues) {
this.listValues = listValues;
} //数组集合
private String[] arrayValues;
public String[] getArrayValues() {
return arrayValues;
}
public void setArrayValues(String[] arrayValues) {
this.arrayValues = arrayValues;
} //Map集合
private Map mapValues;
public Map getMapValues() {
return mapValues;
}
public void setMapValues(Map mapValues) {
this.mapValues = mapValues;
}
}
该类中封装了几种经常使用的集合。想要转化为关系模型。就必须来看下文的映射。
1.4 集合映射
集合的映射事实上相当的简单,仅仅须要加入相应的集合标签。Hibernate分别提供了集合标签<set>、<map>、<list>、<array>。通过使用集中标签来将集合映射为相应的关系表。另外通过加入<key>标签来实现表外键的关联,其他的属性通过使用<element>来加入。
CollectionMapping.hbm.xml
<?xml version="1.0"?>
<!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.hibernate.CollectionMapping" table="t_collection_mapping">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/> <set name="setValues" table="t_set_values">
<key column="set_id"></key>
<element type="string" column="set_value"></element>
</set>
<list name="listValues" table="t_list_values">
<key column="list_id"/>
<list-index column="list_index"/>
<element type="string" column="list_value"/>
</list>
<map name="mapValues" table="t_map_values">
<key column="map_id"/>
<map-key type="string" column="map_key"/>
<element type="string" column="map_value"/>
</map>
<array name="arrayValues" table="t_array_value">
<key column="array_id"/>
<index column="array_index" type="integer"></index>
<element type="string" column="array_value"/>
</array>
</class>
</hibernate-mapping>
须要注意的是list标签和array标签。这两种集合内的对象是有顺序的。所以在加入映射标签时须要使用list-index或者index标签来标明对象的顺序。并且在加入子标签时一定要依照顺序加入。也就是说先加入<key>标签。后加入<list-index>标签,最后加入<element>标签。否则的话会出现例如以下错误:
The content of element type "list" must match "(meta*,subselect?,cache?,synchronize*,comment?,key,(index|list-index),(element|one-to-many|many-to-many|composite-element|many-to-any),loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,filter*)".
1.5 关系模型
将配置好的对象模型转化为对应的关系模型。生成的SQL语句例如以下:
alter table t_array_value drop foreign key FK2E0DD0C067676B68
alter table t_list_values drop foreign key FKE01EC98BF4FCB03
alter table t_map_values drop foreign key FKD169BA107402B585
alter table t_set_values drop foreign key FK7BB8D04A7E79F8BF
drop table if exists t_array_value
drop table if exists t_collection_mapping
drop table if exists t_list_values
drop table if exists t_map_values
drop table if exists t_set_values
create table t_array_value (array_id integer not null, array_value varchar(255), array_index integer not null, primary key (array_id, array_index))
create table t_collection_mapping (id integer not null auto_increment, name varchar(255), primary key (id))
create table t_list_values (list_id integer not null, list_value varchar(255), list_index integer not null, primary key (list_id, list_index))
create table t_map_values (map_id integer not null, map_value varchar(255), map_key varchar(255) not null, primary key (map_id, map_key))
create table t_set_values (set_id integer not null, set_value varchar(255))
alter table t_array_value add index FK2E0DD0C067676B68 (array_id), add constraint FK2E0DD0C067676B68 foreign key (array_id) references t_collection_mapping (id)
alter table t_list_values add index FKE01EC98BF4FCB03 (list_id), add constraint FKE01EC98BF4FCB03 foreign key (list_id) references t_collection_mapping (id)
alter table t_map_values add index FKD169BA107402B585 (map_id), add constraint FKD169BA107402B585 foreign key (map_id) references t_collection_mapping (id)
alter table t_set_values add index FK7BB8D04A7E79F8BF (set_id), add constraint FK7BB8D04A7E79F8BF foreign key (set_id) references t_collection_mapping (id)
生成的相应的数据库视图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="text-align:center">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
二、数据操作
2.1 数据写入
写入数据操作,将数据写入时须要注意创建数据对象,当中的List、Set、Map须要创建数据对象。将数据对象写入到数据库中,由于它们三者都是对象接口,所以须要创建一个对象。将对象写入到数据库中,详细代码例如以下:
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testsave(){ Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction(); CollectionMapping cm=new CollectionMapping();
cm.setName("zhangsan"); Set set=new HashSet();
set.add("a");
set.add("b");
cm.setSetValues(set); List list=new ArrayList();
list.add("list1");
list.add("list2");
cm.setListValues(list); String[] str=new String[]{"array1","array2"};
cm.setArrayValues(str); Map map=new HashMap();
map.put("k1","v1");
map.put("k2", "v2");
cm.setMapValues(map); session.save(cm);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的SQL语句例如以下:
Hibernate: insert into t_collection_mapping (name) values (?)
Hibernate: insert into t_set_values (set_id, set_value) values (?, ?)
Hibernate: insert into t_set_values (set_id, set_value) values (?, ? )
Hibernate: insert into t_list_values (list_id, list_index, list_value) values (?, ? , ?)
Hibernate: insert into t_list_values (list_id, list_index, list_value) values (? , ?, ? )
Hibernate: insert into t_map_values (map_id, map_key, map_value) values (? , ? , ?)
Hibernate: insert into t_map_values (map_id, map_key, map_value) values (? , ?, ?)
Hibernate: insert into t_array_value (array_id, array_index, array_value) values (?, ?, ? )
Hibernate: insert into t_array_value (array_id, array_index, array_value) values (? , ?, ?)
2.2 载入数据
载入数据的方法非常easy。它会将表中的数据依照集合载入到对象中,然后仅仅须要获取对应的对象集合就可以。
public void testload(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction(); CollectionMapping cm=(CollectionMapping)session.load(CollectionMapping.class, 1); System.out.println("cm.name= "+cm.getName());
System.out.println("cm.list= "+cm.getListValues());
System.out.println("cm.map= "+cm.getMapValues());
System.out.println("cm.array= "+cm.getArrayValues());
System.out.println("cm.set= "+cm.getSetValues()); session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的结果:
Hibernate: select collection0_.id as id0_0_, collection0_.name as name0_0_ from t_collection_mapping collection0_ where collection0_.id=? Hibernate: select arrayvalue0_.array_id as array1_0_, arrayvalue0_.array_value as array2_0_, arrayvalue0_.array_index as array3_0_ from t_array_value arrayvalue0_ where arrayvalue0_.array_id=?
cm.name= zhangsan
Hibernate: select listvalues0_.list_id as list1_0_, listvalues0_.list_value as list2_0_, listvalues0_.list_index as list3_0_ from t_list_values listvalues0_ where listvalues0_.list_id=? cm.list= [list1, list2]
Hibernate: select mapvalues0_.map_id as map1_0_, mapvalues0_.map_value as map2_0_, mapvalues0_.map_key as map3_0_ from t_map_values mapvalues0_ where mapvalues0_.map_id=?
cm.map= {k1=v1, k2=v2}
cm.array= [Ljava.lang.String;@758d8478
Hibernate: select setvalues0_.set_id as set1_0_, setvalues0_.set_value as set2_0_ from t_set_values setvalues0_ where setvalues0_.set_id=? cm.set= [b, a]
结语
集合映射在开发过程中不会经经常使用到,可是要做主要的了解,理解这样的映射的实现方法,是通过相相应的集合标签来实现的模型转化。非常easy。截止到该篇文章。Hibernate主要的映射已经讨论完毕,这些映射是对象模型转化为关系模型中经经常使用到的,文章对映射的使用方法做了具体的讨论,它们之间的关系还没有做进一步的探讨,所下面篇文章将会对映射做主要的总结展望,对映射进行对照分类。
【Hibernate步步为营】--最后的集合映射的更多相关文章
- 【Hibernate步步为营】--多对多映射具体解释
上篇文章具体讨论了一对多映射,在一对多映射中单向的关联映射会有非常多问题,所以不建议使用假设非要採用一对多的映射的话能够考虑使用双向关联来优化之间的关系,一对多的映射事实上质上是在一的一端使用< ...
- 【转载】Hibernate之hbm.xml集合映射的使用(Set集合映射,list集合映射,Map集合映射)
https://www.cnblogs.com/biehongli/p/6555994.html
- 【Hibernate步步为营】--映射合集汇总
前几篇文章具体讨论了对象模型到关系模型的转化方法,对映射关系做了具体的了解,Hibernate将对象模型转化为对应的关系模型是通过使用对应的映射来完毕的(相同也能够使用注解),对于对象之间的关系的转化 ...
- Hibernate的集合映射与sort、order-by属性
[Hibernate]Hibernate的集合映射与sort.order-by属性 常用集合Set.List.Map,相信大家都很熟悉,面试中也会经常问.Set和List都继承了Collection接 ...
- Hibernate征途(七)之复合主键映射和集合映射
把这两种映射放到一起说,是因为这两种映射不像前面的复用型映射.数量和方向型映射那么分类鲜明,所以放到了这个“其他”里面. 复合主键映射 在关系模型中,复合主键和其他的主键方式没有很大区别,但是反映到对 ...
- HIbernate学习笔记(七) hibernate中的集合映射和继承映射
九. 集合映射 1. Set 2. List a) @OrderBy 注意:List与Set注解是一样的,就是把Set更改为List就可以了 private List< ...
- Hibernate的集合映射(Set、List、Array、Map、Bag)
POJOs如下: Customer类------>customer表 Order类对应---------->orders表 customer(1)<-------------- ...
- hibernate集合映射inverse和cascade详解
hibernate集合映射inverse和cascade详解 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
- Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)
Set类型的使用: <hibernate-mapping package="cn.model"> <class name="Department&quo ...
随机推荐
- python(44):array和matrix的运算
在NumPy中,array用于表示通用的N维数组,matrix则特定用于线性代数计算.array和matrix都可以用来表示矩阵,二者在进行乘法操作时,有一些不同之处. 使用array时,运算符 * ...
- SpringBoot热部署配置(基于Maven)
热部署的意思是只要类中的代码被修改了,就能实时生效,而不用重启项目.spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原 ...
- hadoop的核心思想【转】
[转自]:http://www.superwu.cn/2014/01/10/963/ 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. ...
- LeetCode: Gas Station 解题报告
Gas Station There are N gas stations along a circular route, where the amount of gas at station i is ...
- 设置定时任务(Timer类的介绍)
设置定时任务(Timer类的介绍) 在我们的很多项目中,我们都须要用到定时任务,因此想借此博文来对定时任务进行一个介绍. 设置定时任务过程例如以下: 先new一个Timer对象 Timer timer ...
- 多平台的网站实现单点登录系统(SSO)的开发思路 让你的会员中心更加统一(参考资料)
单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案.而近期以CSDN明文存储用户密码 ...
- [转]python进行中文文本聚类(切词以及Kmeans聚类)
简介 查看百度搜索中文文本聚类我失望的发现,网上竟然没有一个完整的关于Python实现的中文文本聚类(乃至搜索关键词python 中文文本聚类也是如此),网上大部分是关于文本聚类的Kmeans聚类的原 ...
- C语言 · 十进制数转八进制数
算法训练 十进制数转八进制数 时间限制:1.0s 内存限制:512.0MB 编写函数把一个十进制数输出其对应的八进制数. 样例输入 9274 样例输出 22072 #includ ...
- <[长期赢利:股票价值投资方法]>读书笔记
书在这里 风险是因为不够专业 在股市里,要不断拓宽自己的眼界 投资如长跑,贵在坚持 长线为主,短线为辅:重视选股,减少盲目:耐心等待,春天回来 除了要与银行利息比以外,还要了解当时股票的平均市盈率,再 ...
- <要做股市赢家:杨百万>读书笔记
书在这里 和这里: 要注意的是,并不是政府每出台一个政策股价就要变.如果听到各种消息,市场却没有反应,就不要去做这个聪明人.有消息后应该密切关注市场反应,看成交量.价格的变化等等,再作决定.总之,关键 ...