Hibernate关系映射
Hibernate关系映射
Hibernate关系映射其实就是将关系模型中实体之间的三种关系——多对一(一对多)、一对一、多对多映射成对象模型——Java这样的面向对象语言中相应的属性之间的关系。
多对一(many-to-one)
多对一表示的是多个属性值对应于一个属性值,可以参考员工和部门之间的关系。在Java中就是员工中有部门这个属性。
参考Domain代码:
class Employee{private Integer id;private String name;private Department depart;
}class Department{private Integer id;private String name;
}
多对一关系映射图
多对一的配置
在多的那边,也就是Employee.hbm.xml中,在class元素下添加<many-to-one name=”depart” column=”depart_id” />。
案例:
public static void add() {//把对象模型-》关系模型//当你获取一个session ,就会让hiberate去读取//hibernate.cfg.xml,这就会加载对象映射文件,从而完成创建Session session=null;Transaction ts=null;try {session=HibernateUtil.getThreadLocalSession();ts=session.beginTransaction();//添加一个记录Department d1=new Department();d1.setName("财务部");Employee e1=new Employee();e1.setName("zs");e1.setDepartment(d1);Employee e2=new Employee();e2.setName("ls");e2.setDepartment(d1);// 可以先保存员工在保存部门,不过会多产生一些SQL语句session.save(d1);session.save(e1);session.save(e2);ts.commit();} catch (Exception e) {e.printStackTrace();if(ts!=null){ts.rollback();}// TODO: handle exception}finally{if(session!=null&&session.isOpen()){session.close();}}}
一对多(one-to-many)
一对多表示的是一个属性值对应于多个属性值,可以参考部门和员工之间的关系。在Java中就是部门有员工这个集合属性。
参考Domain代码:
class Department{private Integer id;private String name;private Set<Employee> emps;
}class Employee{private Integer id;private String name;private Department depart;
}
一对多关系映射图
一对多的配置
<set name=”emps”><key column=”depart_id”/><one-to-many class=”Employee”/>
</set>
案例:
public static void main(String[] args) {// TODO Auto-generated method stub//通过获取一个sesion,让hibernate框架运行(config->加载hibernate.cfg.xml)Session s=null;Transaction tx=null;try {//我们使用基础模板来讲解.s=HibernateUtil.getCurrentSession();tx=s.beginTransaction();//查询所有1号部门的学生//String hql="from Student where dept.id=1";//方法2/* Department department1=(Department) s.get(Department.class, 3);//取出该部门的学生Set<Student> stus= department1.getStus();for(Student ss: stus){System.out.println(ss.getName());}*///添加学生Department department=new Department();department.setName("业务部门");Student stu1=new Student();stu1.setName("zs");Student stu2=new Student();stu2.setName("ls");Set sets=new HashSet<Student>();sets.add(stu1);sets.add(stu2);department.setStus(sets);// 要配置<set name="stus" cascade="save-update">才能级联保存s.save(department);tx.commit();} catch (Exception e) {if(tx!=null){tx.rollback();}}finally{if(s!=null && s.isOpen()){s.close();}}}
PS:在Hibernate开发中,一对多和多对一一般是并存的,也就是存在一对多关系就会存在多对一关系,反应在Java代码中就是,一的那边有一个集合属性,里面放的是多的那边的对象,多的那边有一个一的对象属性。这样做的话,能够实得HQL查询起来特别方便,但是有一个懒加载的问题,这个问题在之后的博客中会讲到。
一对一(one-to-one)
一对一表示的是一个属性值对应于一个属性值,可以参考人和身份证编号之间的关系。在Java中就是一个人只对应一个身份证编号。
参考Domain代码:
class Person{private Integer id;private String name;private IdCard idCard;
}class IdCard{private Integer id;private java.util.Date useful_life;private Person person;
}
1、基于主键的one-to-one
基于主键的一对一关系映射图
基于主键的一对一关系原理图
2、基于外键的one-to-one
基于外键的一对一关系映射图
基于外键的一对一关系原理图
PS:唯一的多对一关系,就变成了一对一关系了,采用domain->DB的开发方法时也会在Idcard表中生成外键。
多对多(many-to-many)
多对多表示的是多个属性值对应于多个属性值,可以参考学生和课程之间的关系。因为多对多关系在操作和性能上不太理想,所以多对多映射使用较少,而是将多对多关系转化为一对多关系和多对一关系。
参考Domain代码:
class Student {private BigDecimal sid;private String sname;private Set studcourses = new HashSet(0);
}public class Course {private BigDecimal cid;private String cname;private Short ccredit;private Set studcourses = new HashSet(0);
}public class Studcourse {private BigDecimal stucourseid;private BigDecimal grade;private Student student;private Course course;
}
多对多关系映射图
多对多关系原理图
级联操作
级联(cascade)操作用来说明当对主对象进行某种操作时是否对其关联的从对象也做类似的操作。例如想删除选课系统中某个学生的时候,同时也自动把他选的课程都删除掉。
常用的cascade属性值
none,all,save-update,delete,lock,refresh,evict,replicate,persist,merge,delete-orphan (one-to-many) 。
案例:如何配置级联操作,当删除某个部门的时候,我们自动删除其学生
配置文件:
<!-- 配置one-to-many关系 cascade="delete" 当删除该部门的时候(主对象,则级联删除它的学生从对象) -->
<set name="stus" cascade="delete"><!-- 指定Student类对应的外键 --><key column="dept_id" /> <one-to-many class="Student" />
</set>
java代码:
//演示删除级联
//获取到某个部分
Department department=(Department) s.get(Department.class, 41);
s.delete(department);
案例:演示save-update的级联操作
配置文件:
<set name="stus" cascade="save-update"><!-- 指定Student类对应的外键 --><key column="dept_id" /><one-to-many class="Student" />
</set>
Java代码:
//添加学生
Department department=new Department();
department.setName("业务部门3");Student stu1=new Student();
stu1.setName("zs");
Student stu2=new Student();
stu2.setName("小明6");
Set<Student> students=new HashSet<Student>();
students.add(stu1);
students.add(stu2);
department.setStus(students);
s.save(department);
PS:一般对many-to-one,many-to-many不设置级联,在one-to-many(one的一方,比如Employee-Department),和one-to-one(主对象一方)中设置级联。
----------参考《韩顺平.hibernate从入门到精通》
Hibernate关系映射相关推荐
- Hibernate 关系映射
第 1 章主要讲解了 Hibernate,它是一个开放源代码的对象关系映射框架.通过对JDBC 进行轻量级的对象封装,使 Java 程序员能够随心所欲地使用面向对象的编程思维来操作数据库.作为目前最杰 ...
- 初识Hibernate——关系映射
Hibernate的主要目的就是是Java程序员可以随心所欲的使用对象编程思维来操纵数据库.所以,一些数据库表的关系我们应该可以通过hibernate实现,比如在数据库中我们厂用的用到的主外键关系,还 ...
- hibernate关系映射(一对一)
一对一关联分为外键关联和主键关联:外键关联是指从表中存在主表的外键,这也是一种特殊的多对一关系:主键关联是指主从表的id一致 外键关联 主表:IDCard(校园卡) 从表:Student(学生) 学生 ...
- Hibernate关系映射和HQL
1.单表映射:a.public class User { private Integer id; private String name; get/set} b.xml: <class name ...
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式
首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...
- 详谈Hibernate框架关系映射!
接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!! 你还可以保存一个对象, ...
- Hibernate 一对一关系映射总结篇
在Hibernate 关系映射中一对一是比较常见也常用的一种,一对一的关系映射类型中又可分为:一对一外键单向映射.一对一外键双向映射.一对一主键单向映射和一对一主键双向映射. 下面就简单的说下自己对这 ...
- Hibernate对象关系映射详解之一对多关系映射
Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...
- 【Hibernate】映射关系总结
在hibernate中,由于是对对象进行操作,但是要实现表与表之间的关系,是怎么样实现的呢? 一.Hibernate的映射 Hibernate是对对象进行操作,Hibernate的映射是描述数据库表的 ...
最新文章
- 使用Python,dlib,OpenCV在实时的视频流中进行面部标志检测
- 5.1软件升级的小阳春
- ActionScript 3.0 Step By Step系列(三):学学流程控制,编编if-else switch while for
- 笔记-TCPCLIENT
- com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed
- 循环队列CircleQueue的使用
- 安卓学习笔记01:安装集成开发环境Android Studio
- 安装apache 后,找不到服务,解决办法
- [当当网,你意欲何为]之二:无奈,配送之痛
- 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。...
- python生成器yield原理_python生成器generator,yield
- git管理工具commit后提交记录消失不见
- JAVA系统学习之三大版本JavaSE、javaEE、javaME
- Permute 3 for mac(万能音视频转换器)
- 利用Pano2VR在全景图中添加视频,音频,图片
- 桌面图标有蓝底怎么办
- 论如何设计博客分类标签系统
- i.MX6ULL系统移植 | 移植NXP官方linux4.1.15内核
- PMO和PM如何准备项目状态报告及进行项目进度汇报?【附项目状态表和进度跟踪表】
- 2021互联网大厂端午礼盒大盘点~
热门文章
- Linux下安装及使用mysql
- Android 视频通信,低延时解决方案
- 【Python】蟒蛇绘制
- C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)
- mitmproxy可谓神器乎?
- 字符串第一个出现的单个字符_如何在不编写单个应用程序的情况下找到我的第一个开发人员工作
- docker引导java_让我引导您完成与Docker的第一次约会
- axure菜单移动隐藏_如何使用隐藏的移动网络更快地完成工作
- fcn从头开始_从头开始有营销问题
- Error: 'conda' can only be installed into the root environment