Java的Hibernate框架中集合类数据结构的映射编写课案.docx
《Java的Hibernate框架中集合类数据结构的映射编写课案.docx》由会员分享,可在线阅读,更多相关《Java的Hibernate框架中集合类数据结构的映射编写课案.docx(12页珍藏版)》请在冰豆网上搜索。
Java的Hibernate框架中集合类数据结构的映射编写课案
Java的Hibernate框架中集合类数据结构的映射编写教程
Hibernate可以将Java中几个内置的集合结构映射为数据库使用的关系模型,下面我们就来看一下Java的Hibernate框架中集合类数据结构的映射编写教程:
一、集合映射
1.集合小介
集合映射也是基本的映射,但在开发过程中不会经常用到,所以不需要深刻了解,只需要理解基本的使用方法即可,等在开发过程中遇到了这种问题时能够查询到解决方法就可以了。
对应集合映射它其实是指将java中的集合映射到对应的表中,是一种集合对象的映射,在java中有四种类型的集合,分别是Set、Map、List还有普通的数组,它们之间有很大的区别:
(1)Set,不可以有重复的对象,对象是无序的;
(2)List,可以与重复的对象,对象之间有顺序;
(3)Map,它是键值成对出现的;
(4)数组,可以重复,对象之间有顺序。
它们之间的区别决定了在开发时使用哪种集合,通常在开发时会使用Set,它内部的对象是无需的,并可以使用迭代器获取内部对象。
这几种集合想要映射到相应的关系模型的话就必须使用Hibernate提供的映射标签,、、
2.映射小介
继续讨论集合映射的关系模型,集合映射是指一个对象对应着另一个对象集合,在保存时Hibernate会把数据集合保存到相应的表中,并按照自己分配的id把数据保存到数据表中,如果单独为集合分配了新表,那么会将id分配给集合表的id,那么对应的关系表如下图:
3.类文件
集合映射是如何通过代码实现的,接下来具体分析。
这里把所有的集合封存到一个类中,这个类我们称之为CollectionMapping.java,那么它对应的内部代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
packagecom.hibernate;
importjava.util.List;
importjava.util.Map;
importjava.util.Set;
@SuppressWarnings("rawtypes")
publicclassCollectionMapping{
//id
privateintid;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
//名字
privateStringname;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
//Set集合
privateSetsetValues;
publicSetgetSetValues(){
returnsetValues;
}
publicvoidsetSetValues(SetsetValues){
this.setValues=setValues;
}
//List集合
privateListlistValues;
publicListgetListValues(){
returnlistValues;
}
publicvoidsetListValues(ListlistValues){
this.listValues=listValues;
}
//数组集合
privateString[]arrayValues;
publicString[]getArrayValues(){
returnarrayValues;
}
publicvoidsetArrayValues(String[]arrayValues){
this.arrayValues=arrayValues;
}
//Map集合
privateMapmapValues;
publicMapgetMapValues(){
returnmapValues;
}
publicvoidsetMapValues(MapmapValues){
this.mapValues=mapValues;
}
}
该类中封装了几种常用的集合,想要转化为关系模型,就必须来看下文的映射。
4.集合映射
集合的映射其实相当的简单,只需要添加对应的集合标签,Hibernate分别提供了集合标签、
CollectionMapping.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
需要注意的是list标签和array标签,这两种集合内的对象是有顺序的,所以在添加映射标签时需要使用list-index或者index标签来标明对象的顺序,而且在添加子标签时一定要按照顺序添加,也就是说先添加标签,后添加标签,最后添加标签,否则的话会出现如下错误:
Thecontentofelementtype"list"mustmatch"(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*)".
5.关系模型
将配置好的对象模型转化为相应的关系模型,生成的SQL语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
altertablet_array_valuedropforeignkeyFK2E0DD0C067676B68
altertablet_list_valuesdropforeignkeyFKE01EC98BF4FCB03
altertablet_map_valuesdropforeignkeyFKD169BA107402B585
altertablet_set_valuesdropforeignkeyFK7BB8D04A7E79F8BF
droptableifexistst_array_value
droptableifexistst_collection_mapping
droptableifexistst_list_values
droptableifexistst_map_values
droptableifexistst_set_values
createtablet_array_value(array_idintegernotnull,array_valuevarchar(255),array_indexintegernotnull,primarykey(array_id,array_index))
createtablet_collection_mapping(idullauto_increment,namevarchar(255),primarykey(id))
createtablet_list_values(list_idintegernotnull,list_valuevarchar(255),list_indexintegernotnull,primarykey(list_id,list_index))
createtablet_map_values(map_idintegernotnull,map_valuevarchar(255),map_keyvarchar(255)notnull,primarykey(map_id,map_key))
createtablet_set_values(set_idintegernotnull,set_valuevarchar(255))
altertablet_array_valueaddindexFK2E0DD0C067676B68(array_id),addconstraintFK2E0DD0C067676B68foreignkey(array_id)referencest_collection_mapping(id)
altertablet_list_valuesaddindexFKE01EC98BF4FCB03(list_id),addconstraintFKE01EC98BF4FCB03foreignkey(list_id)referencest_collection_mapping(id)
altertablet_map_valuesaddindexFKD169BA107402B585(map_id),addconstraintFKD169BA107402B585foreignkey(map_id)referencest_collection_mapping(id)
altertablet_set_valuesaddindexFK7BB8D04A7E79F8BF(set_id),addconstraintFK7BB8D04A7E79F8BFforeignkey(set_id)referencest_collection_mapping(id)
生成的对应的数据库视图如下:
二、数据操作
1.数据写入
写入数据操作,将数据写入时需要注意创建数据对象,其中的List、Set、Map需要创建数据对象,将数据对象写入到数据库中,因为它们三者都是对象接口,所以需要创建一个对象,将对象写入到数据库中,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@SuppressWarnings({"unchecked","rawtypes"})
publicvoidtestsave(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
CollectionMappingcm=newCollectionMapping();
cm.setName("zhangsan");
Setset=newHashSet();
set.add("a");
set.add("b");
cm.setSetValues(set);
Listlist=newArrayList();
list.add("list1");
list.add("list2");
cm.setListValues(list);
String[]str=newString[]{"array1","array2"};
cm.setArrayValues(str);
Mapmap=newHashMap();
map.put("k1","v1");
map.put("k2","v2");
cm.setMapValues(map);
session.save(cm);
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的SQL语句如下:
1
2
3
4
5
6
7
8
9
Hibernate:
insertintot_collection_mapping(name)values(?
)
Hibernate:
insertintot_set_values(set_id,set_value)values(?
?
)
Hibernate:
insertintot_set_values(set_id,set_value)values(?
?
)
Hibernate:
insertintot_list_values(list_id,list_index,list_value)values(?
?
?
)
Hibernate:
insertintot_list_values(list_id,list_index,list_value)values(?
?
?
)
Hibernate:
insertintot_map_values(map_id,map_key,map_value)values(?
?
?
)
Hibernate:
insertintot_map_values(map_id,map_key,map_value)values(?
?
?
)
Hibernate:
insertintot_array_value(array_id,array_index,array_value)values(?
?
?
)
Hibernate:
insertintot_array_value(array_id,array_index,array_value)values(?
?
?
)
2.加载数据
加载数据的方法很简单,它会将表中的数据按照集合加载到对象中,然后只需要获取相应的对象集合即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
publicvoidtestload(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
CollectionMappingcm=(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(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的结果:
1
2
3
4
5
6
7
8
9
10
Hibernate:
selectcollection0_.idasid0_0_,collection0_.nameasname0_0_fromt_collection_mappingcollection0_wherecollection0_.id=?
Hibernate:
selectarrayvalue0_.array_idasarray1_0_,arrayvalue0_.array_valueasarray2_0_,arrayvalue0_.array_indexasarray3_0_fromt_array_valuearrayvalue0_wherearrayvalue0_.array_id=?
cm.name=zhangsan
Hibernate:
selectlistvalues0_.list_idaslist1_0_,listvalues0_.list_valueaslist2_0_,listvalues0_.list_indexaslist3_0_fromt_list_valueslistvalues0_wherelistvalues0_.list_id=?
cm.list=[list1,list2]
Hibernate:
selectmapvalues0_.map_idasmap1_0_,mapvalues0_.map_valueasmap2_0_,mapvalues0_.map_keyasmap3_0_fromt_map_valuesmapvalues0_wheremapvalues0_.map_id=?
cm.map={k1=v1,k2=v2}
cm.array=[Ljava.lang.String;@758d8478
Hibernate:
selectsetvalues0_.set_idasset1_0_,setvalues0_.set_valueasset2_0_fromt_set_valuessetvalues0_wheresetvalues0_.set_id=?
cm.set=[b,a]
三、总结
Hibernate可以持久化以下java集合的实例,包括java.util.Map,java.util.Set,java.util.SortedMap,java.util.SortedSet,java.util.List,和任何持久实体或值的数组(使用Set集合类型是最好的选择)。
类型为java.util.Collection或者java.util.List的属性还可以使用"bag"语义来持久。
用于持久化的集合,除了集合接口外,不能保留任何实现这些接口的类所附加的语义(例如:
LinkedHashSet带来的迭代顺序)。
所有的持久化集合,实际上都各自按照HashMap,HashSet,TreeMap,TreeSet和ArrayList的语义直接工作。
更深入地说,对于一个包含集合的属性来说,必须把Java类型定义为接口(也就是Map,Set或者List等),而绝不能是HashMap,TreeSet或者ArrayList。
存在这个限制的原因是,在你不知道的时候,Hibernate暗中把你的Map,Set和List的实例替换成了它自己的关于Map,Set或者List的实现。
(所以在你