hibernate_08_关联映射_一对多
hibernate的映射关系
一对多、多对一、一对一、多对多。
常用的是一对多和多对一。
在数据库中可以通过添加主外键的关联,表现一对多的关系;在hibernate中通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端对象。
下面实现一个增删改查的“一对多”demo:一个班级对应多个学生。
首先创建学生类Student
- package com.imooc.entity;
- import java.io.Serializable;
- public class Student implements Serializable {
- private int sid;
- private String sname;
- private String sex;
- // 在多方定义一个一方的引用
- private Grade grade;
- public int getSid() {
- return sid;
- }
- public void setSid(int sid) {
- this.sid = sid;
- }
- public String getSname() {
- return sname;
- }
- public void setSname(String sname) {
- this.sname = sname;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public Grade getGrade() {
- return grade;
- }
- public void setGrade(Grade grade) {
- this.grade = grade;
- }
- public Student() {
- super();
- }
- public Student(String sname, String sex) {
- super();
- this.sname = sname;
- this.sex = sex;
- }
- }
创建班级类Grade
- package com.imooc.entity;
- import java.io.Serializable;
- import java.util.HashSet;
- import java.util.Set;
- public class Grade implements Serializable {
- private int gid;
- private String gname;
- private String gdesc;
- private Set<Student> students = new HashSet<Student>();
- public int getGid() {
- return gid;
- }
- public void setGid(int gid) {
- this.gid = gid;
- }
- public String getGname() {
- return gname;
- }
- public void setGname(String gname) {
- this.gname = gname;
- }
- public String getGdesc() {
- return gdesc;
- }
- public void setGdesc(String gdesc) {
- this.gdesc = gdesc;
- }
- public Set<Student> getStudents() {
- return students;
- }
- public void setStudents(Set<Student> students) {
- this.students = students;
- }
- public Grade() {
- super();
- }
- public Grade(int gid, String gname, String gdesc) {
- super();
- this.gid = gid;
- this.gname = gname;
- this.gdesc = gdesc;
- }
- public Grade(String gname, String gdesc) {
- super();
- this.gname = gname;
- this.gdesc = gdesc;
- }
- }
创建Student类的映射文件Student.hbm.xml
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <!-- Generated 2017-6-1 14:49:09 by Hibernate Tools 3.5.0.Final -->
- <hibernate-mapping>
- <class name="com.imooc.entity.Student" table="STUDENT">
- <id name="sid" type="int">
- <column name="SID" />
- <generator class="increment" />
- </id>
- <property name="sname" type="java.lang.String">
- <column name="SNAME" />
- </property>
- <property name="sex" type="java.lang.String">
- <column name="SEX" />
- </property>
- </class>
- </hibernate-mapping>
创建Grade类的映射文件Grade.hbm.xml
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <!-- Generated 2017-6-1 14:49:09 by Hibernate Tools 3.5.0.Final -->
- <hibernate-mapping>
- <class name="com.imooc.entity.Grade" table="GRADE">
- <id name="gid" type="int">
- <column name="GID" />
- <generator class="increment" />
- </id>
- <property name="gname" type="java.lang.String">
- <column name="GNAME" length="20" not-null="true" />
- </property>
- <property name="gdesc" type="java.lang.String">
- <column name="GDESC" />
- </property>
- <!-- 指定关联的外键列 -->
- <set name="students" table="STUDENT">
- <key>
- <column name="GID" />
- </key>
- <one-to-many class="com.imooc.entity.Student" />
- </set>
- </class>
- </hibernate-mapping>
创建hibernate的配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="connection.username">root</property>
- <property name="connection.password">root</property>
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">
- <![CDATA[
- jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8
- ]]>
- </property>
- <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
- <property name="show_sql">true</property>
- <property name="format_sql">true</property>
- <property name="hbm2ddl.auto">update</property>
- <!-- 指定映射文件的路径 -->
- <mapping resource="com/imooc/entity/Grade.hbm.xml" />
- <mapping resource="com/imooc/entity/Student.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
写一个增删改查的测试文件
- package com.imooc.test;
- import java.util.Set;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import com.imooc.entity.Grade;
- import com.imooc.entity.Student;
- import com.imooc.util.HibernateUtil;
- /*
- * 单向一对多关系关系(班级--->学生)
- * 建立关联关系后,可以方便的从一个对象导航到另一个对象
- * 注意关联的方向
- */
- public class Test01 {
- public static void main(String[] args) {
- //add();
- //findStudentsByGrade();
- //update();
- delete();
- }
- //将学生添加到班级
- public static void add() {
- Grade g = new Grade("Java一班", "Java软件开发一班");
- Student s1 = new Student("杨康", "男");
- Student s2 = new Student("穆念慈", "女");
- //如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
- g.getStudents().add(s1);
- g.getStudents().add(s2);
- Session session = HibernateUtil.getSession();
- Transaction tr = session.beginTransaction();
- session.save(g);
- session.save(s1);
- session.save(s2);
- tr.commit();
- HibernateUtil.closeSession(session);
- }
- //查询班级中包含的学生
- public static void findStudentsByGrade() {
- Session session = HibernateUtil.getSession();
- Grade grade = (Grade) session.get(Grade.class, 1);
- System.out.println( grade.getGname() + "," + grade.getGdesc() );
- Set<Student> students = grade.getStudents();
- for(Student s : students) {
- System.out.println( s.getSname() + "," + s.getSex() );
- }
- }
- //修改学生信息
- public static void update() {
- Grade g=new Grade("Java二班", "Java软件开发二班");
- Session session = HibernateUtil.getSession();
- Transaction tr = session.beginTransaction();
- Student s = (Student) session.get(Student.class, 1);
- g.getStudents().add(s);
- session.save(g);
- tr.commit();
- HibernateUtil.closeSession(session);
- }
- //删除学生信息
- public static void delete() {
- Session session = HibernateUtil.getSession();
- Transaction tr = session.beginTransaction();
- Student s = (Student) session.get(Student.class, 2);
- session.delete(s);
- tr.commit();
- HibernateUtil.closeSession(session);
- }
- }
hibernate_08_关联映射_一对多的更多相关文章
- 009一对一 主键关联映射_单向(one-to-one)
009一对一 主键关联映射_单向(one-to-one) ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- Hibernate框架--关联映射,一对多,多对多 inverse cascade
回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...
- Hibernate关联映射(一对多/多对多)
版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053. Hibernate关联映射上接Hibernate持久化类:h ...
- 012一对一 唯一外键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- 011一对一 唯一外键关联映射_单向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- 010一对一 主键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- mybatis_10关联查询_一对多
在使用mybatis框架的时候,很多时候需要一个查询结果里的属性包含多个对象,即一条查询结果有属性是集合,这个时候就需要使用collection标签 模型里面有集合 案例: 第一步:在Orders中添 ...
随机推荐
- 4.几个「不难但却很有用」的 Git 技能点
阅读 Git 原理详解及实用指南 记录 tag:不可移动的 branch tag 是一个和 branch 非常相似的概念,它和 branch 最大的区别是:tag 不能移动.所以在很多团队中,tag ...
- svn 使用TortoiseSVN server搭建本地SVN服务器
使用TortoiseSVN server搭建本地SVN服务器
- LeetCode 712. Minimum ASCII Delete Sum for Two Strings
Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...
- 该页必须使用安全性较高的Web 浏览器查看
当用https访问某个网站时,IE提醒“该页必须使用安全性较高的Web 浏览器查看” 您要访问的资源使用了128位版本的“安全套接层(SSL)” 安全保护.要查看该资源,您需要使用支持该版本的SSL浏 ...
- 【codeforces 767B】The Queue
[题目链接]:http://codeforces.com/contest/767/problem/B [题意] 排队去办护照; 给你n个人何时来的信息; 然后问你应该何时去才能在队伍中等待的时间最短; ...
- mysql-sql语句中变量的使用
最近工作中用到mysql,发现mysql和Oracle差别挺大的,其不像Oracle中存在丰富的分析函数(开窗函数),如rank(),lag(),leaf()等,只能用变量来获取以便达到分析函数的效果 ...
- 通过urllib2抓取网页内容(1)
一.urllib2发送请求 import urllib2 url = 'http://www.baidu.com' req = urllib2.Request(url) response = urll ...
- CF #324 DIV2 C题
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- swift 雨燕 新手教程
Apple Swift编程语言新手教程 chox 2014-06-03 文件夹 简单介绍 入门 简单值 控制流 函数与闭包 对象与类 枚举与结构 1 简单介绍 今天凌晨Apple刚刚公布了Swif ...
- 通过buildpath 导入jar和在lib下导入的jar包区别
jar包放置在WEB-INF/lib下和通过build path导入的区别是什么? jar包直接拷贝到WEB-INF/lib下和以userLibrary形式引入的区别? jar包放置在WEB-INF/ ...