什么叫做单向一对多的映射呢?

我们首先要知道映射是有方向的,分为单向和双向。

比如班级和学生。站在班级的角度,一个班级可以有多个学生,  在这里班级就是“一”方 学生就是“多”方

这种关系就是一对多的关系,如果只站在班级的角度,那就是单向的一对多的关系。

一对多的关系我们应该怎么实现呢?

在数据库中我们会通过主外键的方式实现,在多学生表中添加一个外键指向班级

在hibernate中我们会通过在“一”的一方使用<set>元素表示持有“多”的一方的对象,即在“一”方中使用集合 表示持有“多”方

使用工具

  • Junint单元测试工具
  • mysql-connector-java-5.1.7-bin.jar
  • hibernate 4.2.4.jar

hibernate配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/susu</property><property name="connection.username">root</property><property name="connection.password">123</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="myeclipse.connection.profile">MySQLDriver</property><property name="show_sql">true</property><property name="format_sql">true</property><property name="hbm2ddl.auto">create</property><mapping resource="com/scx/entity/Grade.hbm.xml" /><mapping resource="com/scx/entity/Students.hbm.xml" /></session-factory></hibernate-configuration>

因为我们还没有在数据库中创建表 所以要在 hibernate配置文件设置

<property name="hbm2ddl.auto">create</property>

持久化类

students   学生类

package com.scx.entity;public class Students {//学生主键private int sId;//学生姓名private String sName;//学生性别private String sex;//学生年龄private int age;public Students(int sId, String sName, String sex, int age) {this.sId = sId;this.sName = sName;this.sex = sex;this.age = age;}public Students() {}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 int getAge() {return age;}public void setAge(int age) {this.age = age;}}

grade  班级类

package com.scx.entity;import java.util.HashSet;
import java.util.Set;public class Grade {//班级主键private int gId;//班级名称private String gName;//学生集合private Set<Students> students = new HashSet<Students>();public Grade(int gId, String gName, Set<Students> students) {this.gId = gId;this.gName = gName;this.students = students;}public Grade() {}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 Set<Students> getStudents() {return students;}public void setStudents(Set<Students> students) {this.students = students;}//向班级中集合中添加学生public void addStudents(Students stu) {students.add(stu);}
}

对象关系映射文件

Students.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping><class name="com.scx.entity.Students" table="students" catalog="hibernate"><id name="sId" type="java.lang.Integer"><column name="SID" /><generator class="native" /></id><property name="sName" type="java.lang.String"><column name="SNAME" length="20" /></property><property name="sex" type="java.lang.String"><column name="SEX" length="2" /></property><property name="age" type="java.lang.Integer"><column name="AGE"  /></property></class>
</hibernate-mapping>

Grade.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping><class name="com.scx.entity.Grade" table="grade" catalog="hibernate"><id name="gId" type="java.lang.Integer"><column name="GID" /><generator class="native" /></id><property name="gName" type="java.lang.String"><column name="GNAME" length="20" /></property><!-- 配置单向的一对多关联关系 --><set name="students" table="students"><!-- 制定关联的外键列 --><key column="GID"></key><!-- 持久化对象所对应的实体类 --><one-to-many class="com.scx.entity.Students"/></set></class>
</hibernate-mapping>

注意看 在Grade.hbm.xml中我们需要配置单向的一对多关联关系

<set name="students" table="students"><!-- 制定关联的外键列 --><key column="GID"></key><!-- 持久化对象所对应的实体类 --><one-to-many class="com.scx.entity.Students"/></set>

使用junit通过Hibernate API编写访问数据库的代码

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;import com.scx.entity.Grade;
import com.scx.entity.Students;public class Test {private Configuration config;private ServiceRegistry serviceRegistry;private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init() {//创建配置对象config = new Configuration().configure();//创建服务注册对象serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();//创建会话工厂对象sessionFactory=config.buildSessionFactory(serviceRegistry);//会话对象session=sessionFactory.openSession();//开启事务transaction=session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();//提交事务session.close();//关闭会话sessionFactory.close();//关闭会话工厂}@org.junit.Testpublic void testSave(){Students stu1=new Students(1, "小明", "男", 15);Students stu2=new Students(2, "小红", "女", 15);Grade g1=new Grade();Grade g2=new Grade();g1.setgName("软件一班");g2.setgName("软件二班");g1.addStudents(stu1);g2.addStudents(stu2);session.save(g1);session.save(g2);session.save(stu1);session.save(stu2);}
}

实例化了两个学生 两个班级 分别属于一个班级 

运行结果如下:

根据班级查找班级所有学生

首先修改hibernate配置文件中的生成表策略为update

<property name="hbm2ddl.auto">update</property>

然后新添加一个测试

@org.junit.Testpublic void findStudentsByGrade(){Grade g=(Grade) session.get(Grade.class, 1);System.out.println(g.getgName());Set<Students> students=g.getStudents();for (Students stu : students) {System.out.println(stu.getsName()+" "+stu.getSex()+" "+stu.getAge());}}

运行结果:

更新学生信息

@org.junit.Testpublic void update(){Grade g=new Grade();g.setgName("软件三班");Students stu=(Students) session.get(Students.class, 1);g.addStudents(stu);session.save(g);}

新建一个班级为软件三班 并将编号为1的学生添加到软件三班

运行结果:

删除学生

@org.junit.Testpublic void delete(){Students stu=(Students) session.get(Students.class, 2);session.delete(stu);}

查找编号为2的学生 并删除

运行结果如下:


hibernate初探之单向一对多映射相关推荐

  1. Hibernate(四)一对多映射关系(set映射自定义对象)

    续set映射自定义对象的用法 element标签:使用在能直接映射到表中的hibernate支持的java类型数据 one-to-many.many-to-one:使用在映射自定义类中 One to ...

  2. hibernate多对一单向外键

    hibernate多对一单向外键: 描述: 转载于:https://www.cnblogs.com/blogofwyl/p/5402197.html

  3. hibernate注释映射_Hibernate一对多映射示例注释

    hibernate注释映射 Today we will look into One To Many Mapping in Hibernate. We will look into Hibernate ...

  4. 【Hibernate步步为营】--(一对多映射)之单向关联

    上篇文章讨论了双向关联的一对一映射,用了两个章节.主要是从主键和外键两种关联映射展开具体讨论.双向关联的映射须要在两个映射文件里分别加入相互的相应关系,斌刚在相应的类中加入相应的关联类的属性,这样在一 ...

  5. Hibernate关联关系映射-----基于连接表的单向一对多映射配置

    实体: package uni.one2many.jointable;import java.util.HashSet; import java.util.Set;public class Emper ...

  6. 【Hibernate步步为营】--(一对多映射)之双向关联

    上篇文章讨论了单向关联的一对多映射,在一的一端维护双向的关系这种做法虽然能实现但是存在很多缺陷,首先生成很多多余的SQL语句,因为多的一端不维护关系,只有一的一端维护,在进行操作时一的一端会发出多余的 ...

  7. Hibernate初探

    Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行.程序员往往只需定义好了POJO 到数据 ...

  8. Hibernate学习4—关联关系一对多映射2

    第四节:班级学生一对多映射实现(双向) 查询班级的时候能够获取所有的学生: 在上一节的基础之上:我们在Class端也保存学生的关系: com.cy.model.Class: public class ...

  9. Hibernate一对多单向关联和双向关联映射方法及其优缺点

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同. 它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的 ...

最新文章

  1. Android输入法遮挡了输入框,使用android:fitsSystemWindows=“true“后界面顶部出现白条解决方案
  2. docker 2375 vulnerability and self-signatuer certifications
  3. 30-35岁职场规划深谈,字字戳心
  4. MyBatis 源码分析系列文章导读
  5. Spring Cloud Gateway(路由)
  6. Ubuntu设置环境变量并立即生效
  7. 前端为什么要使用组件化的思想,通过一个实例来分析
  8. 不要笑!写 | 还是 || ,还真是一个问题
  9. linux程序已经在后台运行冻结了_Linux 让程序在后台执行
  10. 数据结构-使用两个栈实现一个队列
  11. 计算机电源管理设置,关于电源管理的电源管理计划设置
  12. 购物车单选全选,计算总价,出现个小问题,没找到.....
  13. 平凡而又神奇的贝叶斯方法(转)
  14. 永磁同步电机PMS直接转矩控制 Matlab/Simulink仿真模型
  15. MMDetection CenterNet 源码解析
  16. 加拿大移民-雇主担保移民政策解读
  17. 阿里云服务器部署springboot项目
  18. PPT常用快捷键汇总
  19. 太原师范学院计算机考研率,太原师范学院怎么样(太原师范学院考研率)
  20. 步进电机应用c语言程序设计实例,51单片机调节步进电机应用C语言程序设计

热门文章

  1. 常见前端面试题整理(带答案)
  2. sublime3 SFTP 提示Validating remote folder
  3. android+打开菜单,Android制作微信app顶部menu菜单(ActionBar)
  4. python千位分隔符_python – 如何设置自定义千位分隔符?
  5. strtol全面解析
  6. C 库函数 - strtol()
  7. mysql 复合主键 单独_怎么把复合主键改为单一主键
  8. 数据库中复合主键的应用场景
  9. 木木的Java知识整理——JDBC与MyBatis的区别
  10. Warning: (3719, 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias fo