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 }