Hibernate类中集合的映射

1 pojo类集合属性的映射

在pojo类中定义集合属性。

1.1  List集合属性的映射

 1 package org.guangsoft.pojo;
 2 import java.util.List;
 3 public class Student
 4 {
 5     // 简单属性
 6     private Integer sno;
 7     private String sname;
 8     private String address;
 9     private String birthday;
10     // 定义List集合属性,爱好
11     private List<String> hobbys;
12     public Integer getSno()
13     {
14         return sno;
15     }
16     public void setSno(Integer sno)
17     {
18         this.sno = sno;
19     }
20     public String getSname()
21     {
22         return sname;
23     }
24     public void setSname(String sname)
25     {
26         this.sname = sname;
27     }
28     public String getAddress()
29     {
30         return address;
31     }
32     public void setAddress(String address)
33     {
34         this.address = address;
35     }
36     public String getBirthday()
37     {
38         return birthday;
39     }
40     public void setBirthday(String birthday)
41     {
42         this.birthday = birthday;
43     }
44     public List<String> getHobbys()
45     {
46         return hobbys;
47     }
48     public void setHobbys(List<String> hobbys)
49     {
50         this.hobbys = hobbys;
51     }
52

1.2 建立pojo的映射文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="org.guangsoft.pojo">
 6     <!-- 类 到 表 -->
 7     <class name="Student" table="t_student">
 8         <id name="sno" column="sno" type="java.lang.Integer">
 9             <generator class="native"></generator>
10         </id>
11         <!-- 其他简单属性 -->
12         <property name="sname" column="sname" type="java.lang.String"></property>
13         <property name="address" column="address" type="java.lang.String"></property>
14         <property name="birthday" column="birthday" type="java.lang.String"></property>
15         <!-- list集合属性的映射,学生的爱好 -->
16         <list name="hobbys" table="t_hobbys">
17             <!-- t_hobbys 中的外键 ,引用t_student中的sno t_student 为主表 t_hobbys 为子表,主外键关系是子表中的某个列(外键),引用主表的主键 
18                 t_hobbys中的主键为联合主键(sno,idx) -->
19             <!-- key为爱好表中的外键 -->
20             <key column="sno"></key>
21             <!-- 元素在List集合中的下标 -->
22             <index column="idx" type="java.lang.Integer"></index>
23             <element column="hbys" type="java.lang.String"></element>
24         </list>
25     </class>
26 </hibernate-mapping>                                                         
27  

1.3 加载映射文件产生数据库模型

两张表产生主外键关系

 

1.4.1 添加学生信息和爱好1.4 进行学生数据的操作

 1 /**
 2  * 添加学生信息,同时增加学生的爱好
 3  * ***/
 4 @Test
 5 public void saveStudent(){
 6     //获得数据库会话对象
 7     Session session = sf.openSession();
 8     //开启事务
 9     Transaction tr = session.beginTransaction();
10     //创建Student对象
11     Student stu = new  Student();
12     stu.setSname("周润发");
13     stu.setAddress("香港");
14     stu.setBirthday("1988-10-10");
15     //封装爱好数据
16     List<String> list = new ArrayList<String>();
17     list.add("吃");
18     list.add("喝");
19     list.add("拉");
20     //将list集合封装到stu对象
21     stu.setHobbys(list);
22     //调用session的save方法
23     session.save(stu);
24     //提交事务
25     tr.commit();
26     //释放资源
27     session.close();
28 }

1.4.2 修改学生信息和爱好

 1 /**
 2  * 修改学生信息,同时增加学生的爱好
 3  * ***/
 4 @Test
 5 public void updateStudent(){
 6     //获得数据库会话对象
 7     Session session = sf.openSession();
 8     //开启事务
 9     Transaction tr = session.beginTransaction();
10     //获得数据的学生数据
11     Student stu = (Student) session.get(Student.class, 1);
12     //修改学生对象属性
13     stu.setSname("刘德华3");
14     //获得stu对象原来的爱好
15     List<String> list = stu.getHobbys();
16     for(String s:list){
17         System.out.println("s="+s);
18     }
19     //list.add(0, "睡");
20     list.clear();//删除了学生的爱好
21     //重写添加爱好
22     list.add("游戏");
23     list.add("敲代码");
24     //调用session的update方法
25     session.update(stu);
26     //提交事务
27     tr.commit();
28     //释放资源
29     session.close();
30 }

1.4.3 查询学生信息和爱好

 1 /***
 2  * 查询所有学生信息和爱好
 3  * ***/
 4 @Test
 5 public void testSelectStudent(){
 6     //获得数据库会话对象
 7     Session session = sf.openSession();
 8     //定义HQL
 9     String hql="from Student";
10     //执行查询
11     List<Student> list = session.createQuery(hql).list();
12     //遍历集合
13     for(Student stu:list){
14         System.out.println(stu.getSname());
15         //获得学生的爱好
16         List<String> slist=stu.getHobbys();
17         for(String s:slist){
18             System.out.println("\t\ts="+s);
19         }
20     }
21 }

1.4.4.学生信息和爱好的删除

 1 /**
 2  * 删除学生信息,同时删除学生的爱好
 3  * ***/
 4 @Test
 5 public void deleteStudent()
 6 {
 7     //获得数据库会话对象
 8     Session session = sf.openSession();
 9     //开启事务
10     Transaction tr = session.beginTransaction();
11     //获得数据的学生数据
12     Student stu = (Student) session.get(Student.class, 1);
13     //调用session的delete方法
14     session.delete(stu);
15     //提交事务
16     tr.commit();
17     //释放资源
18     session.close();
19 }

1.5 set集合属性的映射

1.5.1 建立pojo加入set集合属性

一个学生多个电话号码

 1 package com.bjsxt.pojo;
 2 import java.util.HashSet;
 3 import java.util.Set;
 4 public class Student {
 5     //简单属性
 6     private Integer sno;
 7     private String sname;
 8     private String address;
 9     private String birthday;
10     //一个人多个电话号码
11     private Set<String> phones = new HashSet<String>();[A2] 
12             public Set<String> getPhones() {
13         return phones;
14     }
15     public void setPhones(Set<String> phones) {
16         this.phones = phones;
17     }
18     public Integer getSno() {
19         return sno;
20     }
21     public void setSno(Integer sno) {
22         this.sno = sno;
23     }
24     public String getSname() {
25         return sname;
26     }
27     public void setSname(String sname) {
28         this.sname = sname;
29     }
30     public String getAddress() {
31         return address;
32     }
33     public void setAddress(String address) {
34         this.address = address;
35     }
36     public String getBirthday() {
37         return birthday;
38     }
39     public void setBirthday(String birthday) {
40         this.birthday = birthday;
41     }
42 }

1.5.2 建立pojo的映射文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="org.guangsoft.pojo">
 6     <!-- 类 到 表 -->
 7     <class name="Student" table="t_student">
 8         <id name="sno" column="sno" type="java.lang.Integer">
 9             <generator class="native"></generator>
10         </id>
11         <!-- 其他简单属性 -->
12         <property name="sname" column="sname" type="java.lang.String"></property>
13         <property name="address" column="address" type="java.lang.String"></property>
14         <property name="birthday" column="birthday" type="java.lang.String"></property>
15         <!-- 进行set集合属性的映射 name:集合属性名称 table:集合属性对应的子表的名称 总结:集合属性的映射三要求 子表 外键 元素(子表中保存的数据) -->
16         <set name="phones" table="t_phone">
17             <key column="sno"></key><!-- 外键 -->
18             <element column="phs"></element><!-- 集合中元素对应的列 -->
19         </set>
20     </class>
21 </hibernate-mapping>

1.5.3 进行学生数据的操作

完成学生数据的curd操作。

常见问题:需要扩大session的生命周期

 

  1 package org.guangsoft.test;
  2 import java.util.List;
  3 import java.util.Set;
  4 import org.hibernate.Criteria;
  5 import org.hibernate.Session;
  6 import org.hibernate.SessionFactory;
  7 import org.hibernate.Transaction;
  8 import org.hibernate.cfg.Configuration;
  9 import org.junit.Test;
 10 import org.guangsoft.pojo.Student;
 11 public class TestCollection
 12 {
 13     /**
 14      * 
 15      * 通过静态代码块加载配置文件
 16      * 
 17      * ****/
 18     static SessionFactory sf = null;
 19     static
 20     {
 21         // 1 创建Configuration对象,用来加载hibernate的配置文件
 22         Configuration cfg = new Configuration();
 23         // 2加载配置文件
 24         cfg.configure("hibernate.cfg.xml");
 25         // 3通过cfg构造一个会话工厂对象
 26         sf = cfg.buildSessionFactory();
 27     }
 28     /**
 29      * 
 30      * 添加学生信息,同时增加学生的电话
 31      * 
 32      * ***/
 33     @Test
 34     public void saveStudent()
 35     {
 36         // 获得数据库会话对象
 37         Session session = sf.openSession();
 38         // 开启事务
 39         Transaction tr = session.beginTransaction();
 40         // 创建Student对象
 41         Student stu = new Student();
 42         stu.setSname("周润发");
 43         stu.setAddress("香港");
 44         stu.setBirthday("1988-10-10");
 45         // 封装电话数据
 46         stu.getPhones().add("110");
 47         stu.getPhones().add("120");
 48         // 调用session的save方法
 49         session.save(stu);
 50         // 提交事务
 51         tr.commit();
 52         // 释放资源
 53         session.close();
 54     }
 55     /**
 56      * 
 57      * 修改学生信息,同时增加学生的爱好
 58      * 
 59      * ***/
 60     @Test
 61     public void updateStudent()
 62     {
 63         // 获得数据库会话对象
 64         Session session = sf.openSession();
 65         // 开启事务
 66         Transaction tr = session.beginTransaction();
 67         // 创建Student对象
 68         Student stu = (Student) session.load(Student.class, 4);
 69         stu.setSname("xxx");
 70         // 修改电话信息
 71         Set<String> phones = stu.getPhones();
 72         phones.clear();
 73         // phones集合添加电话
 74         phones.add("119");
 75         phones.add("911");
 76         // stu.setPhones(phones);
 77         // 调用session的upate方法
 78         session.update(stu);
 79         // 提交事务
 80         tr.commit();
 81         // 释放资源
 82         session.close();
 83     }
 84     /***
 85      * 
 86      * 查询所有学生信息和电话
 87      * 
 88      * ***/
 89     @Test
 90     public void testSelectStudent()
 91     {
 92         // 获得session对象
 93         Session session = sf.openSession();
 94         // 标准的对象查询
 95         Criteria c = session.createCriteria(Student.class);
 96         // 获得集合对象
 97         List<Student> slist = c.list();
 98         // session.close();
 99         // 遍历集合
100         for (Student s : slist)
101         {
102             System.out.println(s.getSname());
103             // 通过对象之间的关联加载获得电话的集合
104             /**
105              * 
106              * no session or session was close
107              * 
108              * 通过对象关联的加载其他数据的时候,也是需要查询数据的,查询数据库的时候数据库连接已经断开
109              * 
110              * ***/
111             Set<String> phones = s.getPhones();
112             for (String p : phones)
113             {
114                 System.out.println("\t\t" + p);
115             }
116         }
117     }
118     /**
119      * 
120      * 删除学生信息,同时删除学生的电话
121      * 
122      * ***/
123     @Test
124     public void deleteStudent()
125     {
126         // 1
127         Session session = sf.openSession();
128         // 2
129         Transaction tr = session.beginTransaction();
130         // 通过查询获得需要删除的对象
131         Student stu = (Student) session.load(Student.class, 4);
132         // 进行删除操作
133         session.delete(stu);
134         // 提交事务
135         tr.commit();
136         // 释放资源
137         session.close();// 不是真正意义上的关闭(将connection对象归还:连接池)
138     }
139 }

1.6 Map集合属性的映射

1.6.1建立Pojo类添加Map属性

 1 package com.bjsxt.pojo;
 2 import java.util.HashMap;
 3 import java.util.Map;
 4 public class Student
 5 {
 6     // 简单属性
 7     private Integer sno;
 8     private String sname;
 9     private String address;
10     private String birthday;
11     // 定义Map属性,一个多个地址,而且对地址进行了编号
12     private Map<String, String> addes = new HashMap<String, String>();
13     public Map<String, String> getAddes()
14     {
15         return addes;
16     }
17     public void setAddes(Map<String, String> addes)
18     {
19         this.addes = addes;
20     }
21     public Integer getSno()
22     {
23         return sno;
24     }
25     public void setSno(Integer sno)
26     {
27         this.sno = sno;
28     }
29     public String getSname()
30     {
31         return sname;
32     }
33     public void setSname(String sname)
34     {
35         this.sname = sname;
36     }
37     public String getAddress()
38     {
39         return address;
40     }
41     public void setAddress(String address)
42     {
43         this.address = address;
44     }
45     public String getBirthday()
46     {
47         return birthday;
48     }
49     public void setBirthday(String birthday)
50     {
51         this.birthday = birthday;
52     }
53 }

1.6.2 建立映射文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="org.guangsoft.pojo">
 6     <!-- 类 到 表 -->
 7     <class name="Student" table="t_student">
 8         <id name="sno" column="sno" type="java.lang.Integer">
 9             <generator class="native"></generator>
10         </id>
11         <!-- 其他简单属性 -->
12         <property name="sname" column="sname" type="java.lang.String"></property>
13         <property name="address" column="address" type="java.lang.String"></property>
14         <property name="birthday" column="birthday" type="java.lang.String"></property>
15         <!-- 进行Map集合属性的映射 三要素:子表 ,外键 ,元素 -->
16         <map name="addes" table="t_addes">
17             <key column="sno"></key><!-- 外键 -->
18             <!-- map元素对应的key -->
19             <map-key type="java.lang.String" column="ky"></map-key>
20             <element column="addes" type="java.lang.String"></element>
21         </map>
22     </class>
23 </hibernate-mapping>

1.6.3 加载配置产生数据模型

 

1.6.4 进行学生信息的添加

 1 /**添加学生信息和地址***/
 2 @Test
 3 public void testSaveStudent(){
 4     //获得session
 5     Session session = sf.openSession();
 6     //开启事务
 7     Transaction tr=session.beginTransaction();
 8     //创建学生对象
 9     Student stu = new Student();
10     stu.setSname("老习");
11     stu.setAddress("陕西");
12     stu.setBirthday("1953-6-26");
13     //指定stu对象的地址
14     stu.getAddes().put("A", "北京");
15     stu.getAddes().put("B", "福建");
16     //保存数据
17     session.save(stu);
18     //提交事务
19     tr.commit();
20     //释放资源
21     session.close();
22 }

1.6.5 查询所有学生数据

 1 /**
 2  * 查询所有学生信息
 3  * ***/
 4 @Test
 5 public void selectStudent(){
 6     //获得session
 7     Session session = sf.openSession();
 8     //查询学生信息
 9     List<Student> slist = session.createCriteria(Student.class).list();
10     //遍历集合
11     for(Student s:slist){
12         System.out.println(s.getSname());
13         //获得学生对象的地址集合
14         Map<String,String> addes=s.getAddes();
15         //遍历Map集合
16         for(Entry<String, String> e:addes.entrySet()){
17             System.out.println("\t\t"+e.getKey()+"   ----    "+e.getValue());
18         }
19     }
20     //释放资源
21     session.close();
22 }

1.6.6修改学生数据

 1 @Test
 2 public void updateStudent(){
 3     //获得session
 4     Session session = sf.openSession();
 5     //开启事务
 6     Transaction tr=session.beginTransaction();
 7     //查询学生对象
 8     Student stu=(Student) session.get(Student.class, 5);
 9     //修改学生属性
10     stu.setSname("小李");
11     //修改地址,修改Map集合中指定键的值
12     stu.getAddes().put("A", "上海");
13     //更新数据
14     session.update(stu);
15     //提交事务
16     tr.commit();
17     //释放资源
18     session.close();
19 }

1.6.7 删除学生数据

 1 /***删除学生信息
 2  * 主表子表一起删除
 3  * ***/
 4 @Test
 5 public void deleteStudent(){
 6     //获得session
 7     Session session = sf.openSession();
 8     //开启事务
 9     Transaction tr=session.beginTransaction();
10     //查询学生对象
11     Student stu=(Student) session.get(Student.class, 5);
12     //删除数据
13     session.delete(stu);
14     //提交事务
15     tr.commit();
16     //释放资源
17     session.close();
18 }

 

posted @ 2016-11-23 14:12  光何  阅读(833)  评论(0编辑  收藏  举报