Hibernate常见集合映射(Set,List Array,Map,Bag)
Hibernate常见的集合映射主要有Set,List,Array,Map,Bag等,它们的特点如下:
1) Set集合是Hibernate中基础的集合类型,元素数据一般使用外键同主表关联,Set集合非常适用于集合元素不能重复的情况。
2) Set集合是无序的,集合元素并不是按照一定的顺序排列的,而List集合是有序的,每个集合元素需要有一个表示集合序号的标识,这样可以使用该标识来获得该集合元素。
3) 数组Array使用的是List的方式来表示的。
4) Map集合的特点是使用键值对,即Key-Value结构来存放集合元素,这样就需要对应的集合元素数据库表中包含对于Key的列。
5) Set集合石无序、不能有重复元素的,Hibernate提供了一个Bag集合,用来处理重复元素的情况。值得注意的是,Bag并不是Java API,而是Hibernate提供的。Bag集合映射和List不同,List的集合元素是有序的,需要有一个集合序号来标识集合元素的位置,List元素可以重复;而Bag集合元素不需要元素序号标识,元素也是可以重复的。
首先建立数据库表,SQL语句如下:
Sql代码
1.CREATE TABLE ‘message’(
2. 'id' int(11) NOT NULL,
3. 'setValue' varchar(100) NOT NULL,
4. 'listValue_id' int(11) NOT NULL,
5. 'listValue' varchar(100) NOT NULL,
6. 'arrayValue_id' int(11) NOT NULL,
7. 'arrayValue' varchar(100) NOT NULL,
8. 'mapValue_id' int(11) NOT NULL,
9. 'mapValue' varchar(100) NOT NULL,
10. 'bagValue' varchar(100) NOT NULL
11.)ENGINE = InnoDB DEFAULT CHARSET = gbk
12.
13.CREATE TABLE 'master'(
14. 'id' int(11) NOT NULL auto_increment,
15. 'name' varchar(100) NOT NULL default '',
16. PRIMARY KEY('id')
17.)ENGINE = InnoDB DEFAULT CHARSET = gbk
建立角色的实体类,代码如下:
Java代码
1.import java.io.Serializable;
2.import java.util.List;
3.import java.util.Map;
4.import java.util.Set;
5.
6.@SuppressWarnings({ "unchecked", "serial" })
7.public class Master implements Serializable {
8. private Integer id; //主键ID属性
9. private String name; //姓名name属性
10. private Set setValue;
11. private List listValue;
12. private String[] arrayValue;
13. private Map mapValue;
14. private List bagValue;
15.
16. public Integer getId() {
17. return id;
18. }
19. public void setId(Integer id) {
20. this.id = id;
21. }
22. public String getName() {
23. return name;
24. }
25. public void setName(String name) {
26. this.name = name;
27. }
28. public Set getSetValue() {
29. return setValue;
30. }
31. public void setSetValue(Set setValue) {
32. this.setValue = setValue;
33. }
34. public List getListValue() {
35. return listValue;
36. }
37. public void setListValue(List listValue) {
38. this.listValue = listValue;
39. }
40. public String[] getArrayValue() {
41. return arrayValue;
42. }
43. public void setArrayValue(String[] arrayValue) {
44. this.arrayValue = arrayValue;
45. }
46. public Map getMapValue() {
47. return mapValue;
48. }
49. public void setMapValue(Map mapValue) {
50. this.mapValue = mapValue;
51. }
52. public List getBagValue() {
53. return bagValue;
54. }
55. public void setBagValue(List bagValue) {
56. this.bagValue = bagValue;
57. }
58.}
类Message的Hibernate映射文件Message.hbm.xml如下:
Xml代码
1. <?xml version="1.0" encoding="utf-8"?>
2.<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3."http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4.<!--
5. Mapping file autogenerated by MyEclipse Persistence Tools
6.-->
7.<hibernate-mapping>
8. <class name="com.iprai.hibernate.collectionmapping" table="master" catalog="iprai">
9. <id name="id" type="java.lang.Integer">
10. <column name="id" />
11. <generator type="java.lang.String">
14. <column name="name" length="100" not-null="true" />
15. </property>
16. <!--Set类型映射-->
17. <set name="setValue" table="message"> //定义对应的表
18. <key column="id" />
19. <element type="java.lang.String">
20. <column name="setValue" />
21. </element>
22. </set>
23.
24. <!--List类型映射-->
25. <List name="listValue" table="message">
26. <key column="id" />
27. <index column="listValue_id" /> //配置主键
28. <element type="java.lang.String" column="listValue" />
29. </List>
30.
31. <!--Array类型映射-->
32. <array name="arrayValue" table="message">
33. <key column="id"/>
34. <list-index column="arrayValue_id"/>
35. <element type="java.lang.String" column="arrayValue"/>
36. </array>
37.
38. <!--Map类型映射-->
39. <map name="mapValue" table="message">
40. <key column="id" />
41. <!--配置键值对-->
42. <map-key column="mapValue_id" type="java.lang.String" />
43. <element type="java.lang.String" column="mapValue" />
44. </map>
45.
46. <!--Bag类型映射-->
47. <bag name="bagValue" table="message">
48. <key column="id" /> //定义主键
49. <element type="string" column="bagValue" /> //定义元素类型
50. </bag>
51. </class>
52.</hibernate-mapping>
JUnit测试代码如下:
Java代码
1.import java.util.ArrayList;
2.import java.util.HashMap;
3.import java.util.HashSet;
4.import java.util.List;
5.import java.util.Map;
6.import java.util.Set;
7.
8.import org.hibernate.Session;
9.
10.import junit.framework.TestCase;
11.
12.public class MasterTest extends TestCase {
13.
14. public void testSave() {
15. Master master = new Master();
16. master.setName("JavaEye");
17.
18. Set setValue = new HashSet();
19. setValue.add("a");
20. setValue.add("b");
21. master.setSetValue(setValue);
22.
23. List listValue = new ArrayList();
24. listValue.add("c");
25. listValue.add("d");
26. master.setListValue(listValue);
27.
28. String[] arrayValue = new String[]{"e", "f"};
29. master.setArrayValue(arrayValue);
30.
31. Map mapValue = new HashMap();
32. mapValue.put("key_1", "value_1");
33. mapValue.put("key_2", "value_2");
34. master.setMapValue(mapValue);
35.
36. List bagValue = new ArrayList();
37. bagValue.add("h");
38. bagValue.add("i");
39. master.setBagValue(bagValue);
40.
41. Session session = null;
42. try {
43. session = HibernateUtils.getSession();
44. session.beginTransaction();
45. session.save(c);
46. session.getTransaction().commit();
47. }catch(Exception e) {
48. e.printStackTrace();
49. session.getTransaction().rollback();
50. }finally {
51. HibernateUtils.closeSession(session);
52. }
53. }
54.}