一、关系表达:

1、一对多、多对一表的关系:

学生表:

班级表:

在学生表中,学生的学号是主键。在班级表中,班级号是主键,因此,学生表的外键是classno。因此,班级对应学生是一对多,学生对应班级是多对一。因为,一个班级可以有多个学生,但是一个学生只能在一个班级。

2、对象的一对多、多对一关系:

(1)在Class类中,定义Set集合,表达一对多的关系:

package pers.zhb.domain;
import java.util.HashSet;
import java.util.Set;
public class Class {
private String classno;
private String department;
private String monitor;
private String classname;
private Set<Student> classes=new HashSet<Student>();//使用set集合表达一对多关系
public Class(){
}
public Set<Student> getClasses() {
return classes;
}
public void setClasses(Set<Student> classes) {
this.classes = classes;
}
public String getMonitor() {
return monitor;
} public void setMonitor(String monitor) {
this.monitor = monitor;
} public String getDepartment() {
return department;
} public void setDepartment(String department) {
this.department = department;
} public String getClassname() {
return classname;
} public void setClassname(String classname) {
this.classname = classname;
}
public String getClassno() {
return classno;
} public void setClassno(String classno) {
this.classno = classno;
}
@Override
public String toString() {
return "Class{" +
"classno='" + classno + '\'' +
", department='" + department + '\'' +
", monitor='" + monitor + '\'' +
", classname='" + classname + '\'' +
", classes=" + classes +
'}';
}
}
package pers.zhb.domain;
public class Student {
private Integer studentno;
private String sname;
private String sex;
private String birthday;
private String classno;
private Float point;
private String phone;
private String email;
private Clas aClas;
public Student(){//无参的构造方法
}
public Clas getaClas() {
return aClas;
} public void setaClas(Clas aClas) {
this.aClas = aClas;
}
@Override
public String toString() {
return "Student{" +
"studentno='" + studentno + '\'' +
", sname='" + sname + '\'' +
", sex='" + sex + '\'' +
", birthday='" + birthday + '\'' +
", classno='" + classno + '\'' +
", point=" + point +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
'}';
} public int getStudentno() {
return studentno;
} public void setStudentno(int studentno) {
this.studentno = studentno;
} 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 String getBirthday() {
return birthday;
} public void setBirthday(String birthday) {
this.birthday = birthday;
} public String getClassno() {
return classno;
} public void setClassno(String classno) {
this.classno = classno;
} public float getPoint() {
return point;
} public void setPoint(float point) {
this.point = point;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
}
} 

(2)定义学生和班级的关系:

package pers.zhb.domain;
import java.util.HashSet;
import java.util.Set;
public class Clas {
private String classno;
private String department;
private String monitor;
private String classname;
private Set<Student> students=new HashSet<Student>();//使用set集合表达一对多关系
public Clas(){
}
public Set<Student> getStudents() {
return students;
}
public void setClasses(Set<Student> students) {
this.students = students;
}
public String getMonitor() {
return monitor;
} public void setMonitor(String monitor) {
this.monitor = monitor;
} public String getDepartment() {
return department;
} public void setDepartment(String department) {
this.department = department;
} public String getClassname() {
return classname;
} public void setClassname(String classname) {
this.classname = classname;
}
public String getClassno() {
return classno;
} public void setClassno(String classno) {
this.classno = classno;
}
@Override
public String toString() {
return "Class{" +
"classno='" + classno + '\'' +
", department='" + department + '\'' +
", monitor='" + monitor + '\'' +
", classname='" + classname + '\'' +
",students=" + students +
'}';
}
}

  

3、配置映射文件:

Class.hbm.xml:

(1)实现一对多的关系映射,即:一个班级对应多个学生:

<?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="pers.zhb.domain">
<class name="Clas" table="class">
<id name="classno" column="classno">
<generator class="native"></generator>
</id><!--主键-->
<property name="department" column="department"></property>
<property name="monitor" column="monitor"></property>
<property name="classname" column="classname"></property>
<set name="students" table="student"><!--一对多关系配置-->
<key column="classno" update="false"></key><!--指定了集合表的外键-->
<one-to-many class="Student"></one-to-many>
</set>
</class>
</hibernate-mapping>
<set name="students">

指定映射的存储学生的集合的名字。

<key column="classesno"></key>

映射的class表的外键。

<one-to-many class="Student"></one-to-many>

指定学生的类型。

(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="pers.zhb.domain">
<class name="Student" table="student">
<id name="studentno" column="studentno" >
<generator class="native"></generator>
</id>
<property name="birthday" column="birthday"></property>
<property name="classno" column="classno" insert="false" update="false"></property>
<property name="email" column="email"></property>
<property name="phone" column="phone"></property>
<property name="sex" column="sex"></property>
<property name="sname" column="sname"></property>
<property name="point" column="point"></property>
<many-to-one name="aClas" column="classno" class="Clas"></many-to-one>
</class>
</hibernate-mapping>

name属性:映射的班级。

column属性:映射的班级对象对应的外键。

class属性:指定班级的类型。

4、主配置文件:

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/stu_mangement</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--配置hibernate信息-可选的-->
<property name="hibernate.show_sql">true</property><!--输出底层sql语句-->
<property name="hibernate.format_sql">true</property><!--格式化输出sql语句-->
<property name="hibernate.hbm2ddl.auto">update</property><!--hibernate帮助创建表,如果已经有表更新表,如果没有则创建新表-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.connection.isolation">4</property>
<!--指定session与当前线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>
<!--配置数据库的方言,让hibernate识别框架自己的特有语句-->
<!--把映射文件放到核心配置文件-->
<mapping resource="pers/zhb/domain/Student.hbm.xml"/><!--都在src目录下-->
<mapping resource="pers/zhb/domain/Class.hbm.xml"/><!--都在src目录下-->
</session-factory>
</hibernate-configuration>

 二、具体运用:

1、增加:

(1)创建一个新班级并为新班级添加两名学生:

public class Test {
public static void testSel() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=new Clas();
clas.setClassname("计科171");
clas.setClassno();
clas.setDepartment("一号楼");
clas.setMonitor("zhai"); Student student=new Student();
student.setSname("翟");
student.setStudentno();
student.setPoint(123f);
student.setSex("男");
student.setBirthday("2019-11-11");
student.setPhone("");
student.setClassno("");
student.setEmail("34288334@qq.com"); Student student1=new Student();
student1.setSname("翟hb");
student1.setStudentno();
student1.setPoint(666f);
student1.setSex("女");
student1.setBirthday("2019-11-11");
student1.setPhone("");
student1.setClassno("");
student1.setEmail("34288334@qq.com"); clas.getStudents().add(student);//一对多,一个班级下有多个学生
clas.getStudents().add(student1);//获取Set集合对象并向其中添加元素 student.setaClas(clas);//多对一,学生属于哪一个班级
student1.setaClas(clas); session.save(clas);
session.save(student);
session.save(student1); transaction.commit();//提交事务
session.close();//关闭资源
}

(2)为一个已经存在的班级添加学生:

 public static void testAdd(){
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=session.get(Clas.class,80501);//获得一个已经存在的班级
Student student=new Student();//创建一个学生对象
student.setSname("翟zz");
student.setStudentno(20190000);
student.setPoint(133f);
student.setSex("男");
student.setBirthday("2019-11-16");
student.setPhone("18739496522");
student.setEmail("34288334@qq.com"); Student student1=new Student();//再创建一个学生对象
student1.setSname("翟zz");
student1.setStudentno(20190000);
student1.setPoint(133f);
student1.setSex("男");
student1.setBirthday("2019-11-16");
student1.setPhone("18739496522");
student1.setEmail("34288334@qq.com"); clas.getStudents().add(student);//学生添加到班级
student.setaClas(clas);//班级与学生对应
clas.getStudents().add(student1);
student1.setaClas(clas); session.save(student);
session.save(student1); transaction.commit();//提交事务
session.close();//关闭资源 }

  

2、删除:

删除80501班的一名学生信息:

 public static void testDel() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=session.get(Clas.class,80501);//获得要删除的学生属于那一个班级
Student student=session.get(Student.class,937221532);//获得要删除的学生
clas.getStudents().remove(student);
student.setaClas(null);
transaction.commit();//提交事务
session.close();//关闭资源
}

 

Hibernate一对多、多对一的关系表达的更多相关文章

  1. 2018.11.4 Hibernate中一对、多对多的关系

    简单总结一下 多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件 一: 多: 操作: 操作管理级别属 ...

  2. hibernate(四) 双向多对多映射关系

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  3. hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有

    今天来到混元气功 这货大概的意思就是你中有我 我中有你 ps 这里就要说到维护关系 ps写这个用了我一下午.......也是刚刚好复习到这里 顺便就写写 注意:一般都在多方维护关系,至于是用单向还是用 ...

  4. Hibernate一对多(多对一)关联关系

    上一篇博文总结了 Hibernate 的一对一的关联关系, 包括基于主键的单向一对一, 基于外键的单向一对一, 基于外键的双向一对一. 下面咱们说一下 Hibernate 的一对多关联关系. 其实一对 ...

  5. Hibernate 一对多/多对多

    一对多关联(多对一): 一对多关联映射: 在多的一端添加一个外键指向一的一端,它维护的关系是一指向多 多对一关联映射: 咋多的一端加入一个外键指向一的一端,它维护的关系是多指向一 在配置文件中添加: ...

  6. hibernate一对多多对一双向

    注意事项:一对多,多对一双向关联,在一的一方的多的getSet集合上的oneToMany上加上mappedBy.告诉hibernate由多的方一来维护关系.这也符合逻辑 ,本来外键就是在加在多的一方. ...

  7. Hibernate(五)之一对多&多对一映射关系

    既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...

  8. Hibernate框架学习(六)——一对多&多对一关系

    一.关系表达 1.表中的表达 2.实体中的表达 3.orm元数据中的表达 一对多:(在Customer.hbm.xml中添加) 多对一:(在LinkMan.hbm.xml中添加) 最后别忘了在hibe ...

  9. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

随机推荐

  1. Anrlr4 生成C++版本的语法解析器

    一. 写在前面 我最早是在2005年,首次在实际开发中实现语法解析器,当时调研了Yacc&Lex,觉得风格不是太好,关键当时yacc对多线程也支持的不太好,接着就又学习了Bison&F ...

  2. Java中ArrayList和LinkedList的性能分析

    ArrayList和LinkedList是Java集合框架中经常使用的类.如果你只知道从基本性能比较ArrayList和LinkedList,那么请仔细阅读这篇文章. ArrayList应该在需要更多 ...

  3. DevSecOps 笔记

    什么是DevSecOps “DevSecOps”,一种全新的安全理念与模式,从DevOps的概念延伸和演变而来,其核心理念为安全是整个IT团队(包括开发.运维及安全团队)每个人的责任,需要贯穿从开发到 ...

  4. Ubuntu php安装xdebug

    1.安装xdebug扩展: sudo apt-get install php-xdebug 2.找到扩展的路径: 3.编辑php.ini文件,末尾加入,保存退出: [xdebug] zend_exte ...

  5. [JZOJ100026]【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为<i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发经 ...

  6. java-try,return和finally相遇时的各种情况

    今天碰到了这样一个问题:使用try,return和finally会碰到的各种情况1,try中有return时,执行顺序:2,try和finally中都有return时,执行顺序:3,运算代码在fina ...

  7. spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform详解

    上一篇文章介绍了springboot依赖版本号管理的几种方式,现在来详细分析一下spring-boot-dependencies.spring-boot-starter-parent.io.sprin ...

  8. python-json与字典的区别

    1.字典的类型是字典dict,是一种数据结构:json的类型是字符串str,json是一种格式: 接口测试是传参数payload时有时候是传的字符串,应该将payload的类型改为json  这点要注 ...

  9. c#菜单动态合并

    说明 在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单.开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并.这是如何实现的呢?本例实现了将两个弹出 ...

  10. Leetcode(4)寻找两个有序数组的中位数

    Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...