Java的Hibernate框架中集合类数据结构的映射编写课案.docx

上传人:b****5 文档编号:8223273 上传时间:2023-01-30 格式:DOCX 页数:12 大小:79.64KB
下载 相关 举报
Java的Hibernate框架中集合类数据结构的映射编写课案.docx_第1页
第1页 / 共12页
Java的Hibernate框架中集合类数据结构的映射编写课案.docx_第2页
第2页 / 共12页
Java的Hibernate框架中集合类数据结构的映射编写课案.docx_第3页
第3页 / 共12页
Java的Hibernate框架中集合类数据结构的映射编写课案.docx_第4页
第4页 / 共12页
Java的Hibernate框架中集合类数据结构的映射编写课案.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Java的Hibernate框架中集合类数据结构的映射编写课案.docx

《Java的Hibernate框架中集合类数据结构的映射编写课案.docx》由会员分享,可在线阅读,更多相关《Java的Hibernate框架中集合类数据结构的映射编写课案.docx(12页珍藏版)》请在冰豆网上搜索。

Java的Hibernate框架中集合类数据结构的映射编写课案.docx

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的实现。

(所以在你

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1