hibernate初探之单向一对多映射
什么叫做单向一对多的映射呢?
我们首先要知道映射是有方向的,分为单向和双向。
比如班级和学生。站在班级的角度,一个班级可以有多个学生, 在这里班级就是“一”方 学生就是“多”方
这种关系就是一对多的关系,如果只站在班级的角度,那就是单向的一对多的关系。
一对多的关系我们应该怎么实现呢?
在数据库中我们会通过主外键的方式实现,在多学生表中添加一个外键指向班级
在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初探之单向一对多映射相关推荐
- Hibernate(四)一对多映射关系(set映射自定义对象)
续set映射自定义对象的用法 element标签:使用在能直接映射到表中的hibernate支持的java类型数据 one-to-many.many-to-one:使用在映射自定义类中 One to ...
- hibernate多对一单向外键
hibernate多对一单向外键: 描述: 转载于:https://www.cnblogs.com/blogofwyl/p/5402197.html
- hibernate注释映射_Hibernate一对多映射示例注释
hibernate注释映射 Today we will look into One To Many Mapping in Hibernate. We will look into Hibernate ...
- 【Hibernate步步为营】--(一对多映射)之单向关联
上篇文章讨论了双向关联的一对一映射,用了两个章节.主要是从主键和外键两种关联映射展开具体讨论.双向关联的映射须要在两个映射文件里分别加入相互的相应关系,斌刚在相应的类中加入相应的关联类的属性,这样在一 ...
- Hibernate关联关系映射-----基于连接表的单向一对多映射配置
实体: package uni.one2many.jointable;import java.util.HashSet; import java.util.Set;public class Emper ...
- 【Hibernate步步为营】--(一对多映射)之双向关联
上篇文章讨论了单向关联的一对多映射,在一的一端维护双向的关系这种做法虽然能实现但是存在很多缺陷,首先生成很多多余的SQL语句,因为多的一端不维护关系,只有一的一端维护,在进行操作时一的一端会发出多余的 ...
- Hibernate初探
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行.程序员往往只需定义好了POJO 到数据 ...
- Hibernate学习4—关联关系一对多映射2
第四节:班级学生一对多映射实现(双向) 查询班级的时候能够获取所有的学生: 在上一节的基础之上:我们在Class端也保存学生的关系: com.cy.model.Class: public class ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同. 它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的 ...
最新文章
- Android输入法遮挡了输入框,使用android:fitsSystemWindows=“true“后界面顶部出现白条解决方案
- docker 2375 vulnerability and self-signatuer certifications
- 30-35岁职场规划深谈,字字戳心
- MyBatis 源码分析系列文章导读
- Spring Cloud Gateway(路由)
- Ubuntu设置环境变量并立即生效
- 前端为什么要使用组件化的思想,通过一个实例来分析
- 不要笑!写 | 还是 || ,还真是一个问题
- linux程序已经在后台运行冻结了_Linux 让程序在后台执行
- 数据结构-使用两个栈实现一个队列
- 计算机电源管理设置,关于电源管理的电源管理计划设置
- 购物车单选全选,计算总价,出现个小问题,没找到.....
- 平凡而又神奇的贝叶斯方法(转)
- 永磁同步电机PMS直接转矩控制 Matlab/Simulink仿真模型
- MMDetection CenterNet 源码解析
- 加拿大移民-雇主担保移民政策解读
- 阿里云服务器部署springboot项目
- PPT常用快捷键汇总
- 太原师范学院计算机考研率,太原师范学院怎么样(太原师范学院考研率)
- 步进电机应用c语言程序设计实例,51单片机调节步进电机应用C语言程序设计
热门文章
- 常见前端面试题整理(带答案)
- sublime3 SFTP 提示Validating remote folder
- android+打开菜单,Android制作微信app顶部menu菜单(ActionBar)
- python千位分隔符_python – 如何设置自定义千位分隔符?
- strtol全面解析
- C 库函数 - strtol()
- mysql 复合主键 单独_怎么把复合主键改为单一主键
- 数据库中复合主键的应用场景
- 木木的Java知识整理——JDBC与MyBatis的区别
- Warning: (3719, 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias fo