1 pojo类集合属性的映射

在pojo类中定义集合属性。

1.1  List集合属性的映射

 package org.guangsoft.pojo;
import java.util.List;
public class Student
{
// 简单属性
private Integer sno;
private String sname;
private String address;
private String birthday;
// 定义List集合属性,爱好
private List<String> hobbys;
public Integer getSno()
{
return sno;
}
public void setSno(Integer sno)
{
this.sno = sno;
}
public String getSname()
{
return sname;
}
public void setSname(String sname)
{
this.sname = sname;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
public String getBirthday()
{
return birthday;
}
public void setBirthday(String birthday)
{
this.birthday = birthday;
}
public List<String> getHobbys()
{
return hobbys;
}
public void setHobbys(List<String> hobbys)
{
this.hobbys = hobbys;
}

1.2 建立pojo的映射文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.guangsoft.pojo">
<!-- 类 到 表 -->
<class name="Student" table="t_student">
<id name="sno" column="sno" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<!-- 其他简单属性 -->
<property name="sname" column="sname" type="java.lang.String"></property>
<property name="address" column="address" type="java.lang.String"></property>
<property name="birthday" column="birthday" type="java.lang.String"></property>
<!-- list集合属性的映射,学生的爱好 -->
<list name="hobbys" table="t_hobbys">
<!-- t_hobbys 中的外键 ,引用t_student中的sno t_student 为主表 t_hobbys 为子表,主外键关系是子表中的某个列(外键),引用主表的主键
t_hobbys中的主键为联合主键(sno,idx) -->
<!-- key为爱好表中的外键 -->
<key column="sno"></key>
<!-- 元素在List集合中的下标 -->
<index column="idx" type="java.lang.Integer"></index>
<element column="hbys" type="java.lang.String"></element>
</list>
</class>
</hibernate-mapping>

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

两张表产生主外键关系

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

 /**
* 添加学生信息,同时增加学生的爱好
* ***/
@Test
public void saveStudent(){
//获得数据库会话对象
Session session = sf.openSession();
//开启事务
Transaction tr = session.beginTransaction();
//创建Student对象
Student stu = new Student();
stu.setSname("周润发");
stu.setAddress("香港");
stu.setBirthday("1988-10-10");
//封装爱好数据
List<String> list = new ArrayList<String>();
list.add("吃");
list.add("喝");
list.add("拉");
//将list集合封装到stu对象
stu.setHobbys(list);
//调用session的save方法
session.save(stu);
//提交事务
tr.commit();
//释放资源
session.close();
}

1.4.2 修改学生信息和爱好

 /**
* 修改学生信息,同时增加学生的爱好
* ***/
@Test
public void updateStudent(){
//获得数据库会话对象
Session session = sf.openSession();
//开启事务
Transaction tr = session.beginTransaction();
//获得数据的学生数据
Student stu = (Student) session.get(Student.class, 1);
//修改学生对象属性
stu.setSname("刘德华3");
//获得stu对象原来的爱好
List<String> list = stu.getHobbys();
for(String s:list){
System.out.println("s="+s);
}
//list.add(0, "睡");
list.clear();//删除了学生的爱好
//重写添加爱好
list.add("游戏");
list.add("敲代码");
//调用session的update方法
session.update(stu);
//提交事务
tr.commit();
//释放资源
session.close();
}

1.4.3 查询学生信息和爱好

 /***
* 查询所有学生信息和爱好
* ***/
@Test
public void testSelectStudent(){
//获得数据库会话对象
Session session = sf.openSession();
//定义HQL
String hql="from Student";
//执行查询
List<Student> list = session.createQuery(hql).list();
//遍历集合
for(Student stu:list){
System.out.println(stu.getSname());
//获得学生的爱好
List<String> slist=stu.getHobbys();
for(String s:slist){
System.out.println("\t\ts="+s);
}
}
}

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

 /**
* 删除学生信息,同时删除学生的爱好
* ***/
@Test
public void deleteStudent()
{
//获得数据库会话对象
Session session = sf.openSession();
//开启事务
Transaction tr = session.beginTransaction();
//获得数据的学生数据
Student stu = (Student) session.get(Student.class, 1);
//调用session的delete方法
session.delete(stu);
//提交事务
tr.commit();
//释放资源
session.close();
}

1.5 set集合属性的映射

1.5.1 建立pojo加入set集合属性

一个学生多个电话号码

 package com.bjsxt.pojo;
import java.util.HashSet;
import java.util.Set;
public class Student {
//简单属性
private Integer sno;
private String sname;
private String address;
private String birthday;
//一个人多个电话号码
private Set<String> phones = new HashSet<String>();[A2]
public Set<String> getPhones() {
return phones;
}
public void setPhones(Set<String> phones) {
this.phones = phones;
}
public Integer getSno() {
return sno;
}
public void setSno(Integer sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}

1.5.2 建立pojo的映射文件

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

1.5.3 进行学生数据的操作

完成学生数据的curd操作。

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

 package org.guangsoft.test;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import org.guangsoft.pojo.Student;
public class TestCollection
{
/**
*
* 通过静态代码块加载配置文件
*
* ****/
static SessionFactory sf = null;
static
{
// 1 创建Configuration对象,用来加载hibernate的配置文件
Configuration cfg = new Configuration();
// 2加载配置文件
cfg.configure("hibernate.cfg.xml");
// 3通过cfg构造一个会话工厂对象
sf = cfg.buildSessionFactory();
}
/**
*
* 添加学生信息,同时增加学生的电话
*
* ***/
@Test
public void saveStudent()
{
// 获得数据库会话对象
Session session = sf.openSession();
// 开启事务
Transaction tr = session.beginTransaction();
// 创建Student对象
Student stu = new Student();
stu.setSname("周润发");
stu.setAddress("香港");
stu.setBirthday("1988-10-10");
// 封装电话数据
stu.getPhones().add("110");
stu.getPhones().add("120");
// 调用session的save方法
session.save(stu);
// 提交事务
tr.commit();
// 释放资源
session.close();
}
/**
*
* 修改学生信息,同时增加学生的爱好
*
* ***/
@Test
public void updateStudent()
{
// 获得数据库会话对象
Session session = sf.openSession();
// 开启事务
Transaction tr = session.beginTransaction();
// 创建Student对象
Student stu = (Student) session.load(Student.class, 4);
stu.setSname("xxx");
// 修改电话信息
Set<String> phones = stu.getPhones();
phones.clear();
// phones集合添加电话
phones.add("119");
phones.add("911");
// stu.setPhones(phones);
// 调用session的upate方法
session.update(stu);
// 提交事务
tr.commit();
// 释放资源
session.close();
}
/***
*
* 查询所有学生信息和电话
*
* ***/
@Test
public void testSelectStudent()
{
// 获得session对象
Session session = sf.openSession();
// 标准的对象查询
Criteria c = session.createCriteria(Student.class);
// 获得集合对象
List<Student> slist = c.list();
// session.close();
// 遍历集合
for (Student s : slist)
{
System.out.println(s.getSname());
// 通过对象之间的关联加载获得电话的集合
/**
*
* no session or session was close
*
* 通过对象关联的加载其他数据的时候,也是需要查询数据的,查询数据库的时候数据库连接已经断开
*
* ***/
Set<String> phones = s.getPhones();
for (String p : phones)
{
System.out.println("\t\t" + p);
}
}
}
/**
*
* 删除学生信息,同时删除学生的电话
*
* ***/
@Test
public void deleteStudent()
{
//
Session session = sf.openSession();
//
Transaction tr = session.beginTransaction();
// 通过查询获得需要删除的对象
Student stu = (Student) session.load(Student.class, 4);
// 进行删除操作
session.delete(stu);
// 提交事务
tr.commit();
// 释放资源
session.close();// 不是真正意义上的关闭(将connection对象归还:连接池)
}
}

1.6 Map集合属性的映射

1.6.1建立Pojo类添加Map属性

 package com.bjsxt.pojo;
import java.util.HashMap;
import java.util.Map;
public class Student
{
// 简单属性
private Integer sno;
private String sname;
private String address;
private String birthday;
// 定义Map属性,一个多个地址,而且对地址进行了编号
private Map<String, String> addes = new HashMap<String, String>();
public Map<String, String> getAddes()
{
return addes;
}
public void setAddes(Map<String, String> addes)
{
this.addes = addes;
}
public Integer getSno()
{
return sno;
}
public void setSno(Integer sno)
{
this.sno = sno;
}
public String getSname()
{
return sname;
}
public void setSname(String sname)
{
this.sname = sname;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
public String getBirthday()
{
return birthday;
}
public void setBirthday(String birthday)
{
this.birthday = birthday;
}
}

1.6.2 建立映射文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.guangsoft.pojo">
<!-- 类 到 表 -->
<class name="Student" table="t_student">
<id name="sno" column="sno" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<!-- 其他简单属性 -->
<property name="sname" column="sname" type="java.lang.String"></property>
<property name="address" column="address" type="java.lang.String"></property>
<property name="birthday" column="birthday" type="java.lang.String"></property>
<!-- 进行Map集合属性的映射 三要素:子表 ,外键 ,元素 -->
<map name="addes" table="t_addes">
<key column="sno"></key><!-- 外键 -->
<!-- map元素对应的key -->
<map-key type="java.lang.String" column="ky"></map-key>
<element column="addes" type="java.lang.String"></element>
</map>
</class>
</hibernate-mapping>

1.6.3 加载配置产生数据模型

1.6.4 进行学生信息的添加

 /**添加学生信息和地址***/
@Test
public void testSaveStudent(){
//获得session
Session session = sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//创建学生对象
Student stu = new Student();
stu.setSname("老习");
stu.setAddress("陕西");
stu.setBirthday("1953-6-26");
//指定stu对象的地址
stu.getAddes().put("A", "北京");
stu.getAddes().put("B", "福建");
//保存数据
session.save(stu);
//提交事务
tr.commit();
//释放资源
session.close();
}

1.6.5 查询所有学生数据

 /**
* 查询所有学生信息
* ***/
@Test
public void selectStudent(){
//获得session
Session session = sf.openSession();
//查询学生信息
List<Student> slist = session.createCriteria(Student.class).list();
//遍历集合
for(Student s:slist){
System.out.println(s.getSname());
//获得学生对象的地址集合
Map<String,String> addes=s.getAddes();
//遍历Map集合
for(Entry<String, String> e:addes.entrySet()){
System.out.println("\t\t"+e.getKey()+" ---- "+e.getValue());
}
}
//释放资源
session.close();
}

1.6.6修改学生数据

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

1.6.7 删除学生数据

 /***删除学生信息
* 主表子表一起删除
* ***/
@Test
public void deleteStudent(){
//获得session
Session session = sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//查询学生对象
Student stu=(Student) session.get(Student.class, 5);
//删除数据
session.delete(stu);
//提交事务
tr.commit();
//释放资源
session.close();
}

Hibernate类中集合的映射的更多相关文章

  1. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

  2. 通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件

    通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件   文章目录 Ja ...

  3. Hibernate(三)——框架中的关系映射

    在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...

  4. Hibernate总结(二)---hibernate中的各种映射

    知识的准备: (参考:汤阳光Hibernate3.6(基础)) 一.浅谈javaBean之间的关系 存在的关系: 1.关联(一对一.一对多.多对一.多对多) 2.聚合/组合(最后考虑) 3.继承 所以 ...

  5. Hibernate 中对象关系映射(ObjectRelationMapping)

    1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...

  6. Hibernate中的一对一映射关系

    Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...

  7. Hibernate框架(三)框架中的关系映射

    在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...

  8. Hibernate用注解实现实体类和表的映射

    数据库mysql: 1.一对一 person50表password50表是一对一的关系: password50表中有外键 person_id person实体类: package com.c50.en ...

  9. Hibernate中的实体映射

     一.一对一映射  如人(Person)与身份证(IdCard) 的关系,即为一对一的关系,一个人只能有一张身份证,一张身份证只能属于某一个人,它们的关系图如下图所示: 在Person实体中添加一个属 ...

随机推荐

  1. 今天<s:hidden>突然能用了

    曾经好几个作业中都想要用<s:hidden>隐形传值,一直没有成功. 今天放弃使用了,竟然成功了. 我放弃使用居然成功了,原来只要设置好getter和setter之后就不用管了,只要变量名 ...

  2. java执行顺序

    本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { Sys ...

  3. iOS中AOP与Method Swizzling 项目中的应用

    引子:项目中需要对按钮点击事件进行统计分析,现在项目中就是在按钮的响应代码中添加点击事件,非常繁琐.所以使用了AOP(面向切面编程),将统计的业务逻辑统一抽离出来. 项目中添加的开源库:https:/ ...

  4. Code First06---CodeFirst中的一对多关系

    本章我将介绍Code First将类之间的引用关系映射为数据表之间的一对多关系的默认规则.主要包含以下两部分内容: 1.Code First将类之间的引用关系映射为数据表之间一对多关系的默认规则. 2 ...

  5. C#GDI+图像处理

    支持格式:BMP.GIF.JPEG.EXIF.PNG.TIFF.ICON.WMF.EMF等,几乎涵盖所有常用格式 图像类: Image类:Bitmap和Metafile的类提供功能的抽象基类. Met ...

  6. HDU 4927 Series 1(高精度+杨辉三角)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4927 解题报告:对于n,结果如下: C(0,n-1) *A[n] - C(1,n-1) * A[n-1 ...

  7. Caffe学习系列(15):添加新层

    如何在Caffe中增加一层新的Layer呢?主要分为四步: (1)在./src/caffe/proto/caffe.proto 中增加对应layer的paramter message: (2)在./i ...

  8. POJ 1995 快速幂模板

    http://poj.org/problem?id=1995 简单的快速幂问题 要注意num每次加过以后也要取余,否则会出问题 #include<iostream> #include< ...

  9. BZOJ 1024: [SCOI2009]生日快乐

    Description 将一个 \(x\times y\) 的矩形分成 \(n\) 块,让最长边:最短边 最小. Sol 搜索. \(n\) 只有 \(10\) 写一个类似于记搜的东西就好了. Cod ...

  10. svn co 与ssl

    默认情况下, yum安装的svn用的是GnuTLS, 而不是ssl, 导致checkout https协议打包的svn repo的时候会报错. 解决方法是用openssl重新编译安装svn.注意ssl ...