hibernate关联关系
hibernate是一个强大的ORM框架,为了使用面向对象的方式管理数据库,hibernate提供了4中关系设置:
1.一对一 (one-to-one)
2.一对多 (one-to-many)
3.多对一 (many-to-one)
4.多对多 (many-to-many)
5最常用的关系是一对多和多对一
6.实现方式:
一对多:在"一方"定义“多方”的集合(set集合)
多对一: 在“多方”定义“一方”的引用(对象属性),多对一和数据库中的关系类似。
多对多:同时在双方设置对方集合
7.双向和单向:单向就是只在一方建立关系,缺点是只能通过一方找到另一方,而无法通过另一方找到一方。双向是在两端都建立关系,这样比较灵活
使用了hibernatr的关联之后,就可以很方便的使用hibernate多表操作
package model; import java.io.Serializable; //多对一
//学生表 n : 1班级表
//在多的一方定义一方引用
public class Student implements Serializable {
private int sid;
private String sname;
private String sex;
private int gid;//班级外键 //一方的引用
private Grade grade; public Student(){ } public Student(int sid) {
super();
this.sid = sid;
} public int getGid() {
return this.getGrade().getGid();
} public void setGid(int gid) {
this.gid = gid;
} public Grade getGrade() {
return grade;
} public void setGrade(Grade grade) {
this.grade = grade;
} public Student(String sname, String sex) {
super();
this.sname = sname;
this.sex = sex;
} 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;
} }
//实体类建立好之后,可以通过hibernate插件自动生成关系
<!-- 单向多对一配置,在多方关联一方外键 -->
<many-to-one name="grade" class="model.Grade" access="field" fetch="join">
<column name="gid" />
</many-to-one>
//班级表
package model; import java.io.Serializable;
import java.util.Set; public class Grade implements Serializable{
private int gid;
private String gname;
private String gdesc; private Set<Student> student; //定义学生集合,一对多,在一方定义多方集合 public Set<Student> getStudent() {
return student;
} public void setStudent(Set<Student> student) {
this.student = student;
} public Grade(){ } public Grade(int gid, String gname, String gdesc) {
super();
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
} public Grade(int gid) {
super();
this.gid = gid;
} public Grade(String gname, String gdesc) {
super();
this.gname = gname;
this.gdesc = gdesc;
} 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;
} }
//班级表关系配置
<!-- 配置一对多关系,设置多方集合 -->
<set name="student" inverse="true" cascade="all">
<key column="gid"></key>
<one-to-many class="model.Student"/>
</set>
//测试类
package test; import java.util.Set; import org.hibernate.Session;
import org.hibernate.Transaction; import util.HibernateUtil;
import model.Grade;
import model.Student; public class Test {
public static void main(String[] args) {
// save();
// findGradeByStudent(1);
findStudentByGrade(1);
} //保存,比较鸡肋,主要用于关联查询,删除等
public static void save(){
Grade grade = new Grade(1);
Student student2 = new Student("廖海2", "男"); //设置多对一关联关系(外键)
student2.setGrade(grade); //执行操作
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();//开启事务
session.save(student2);
System.out.println("save is ok!");
tx.commit(); //事务落地
HibernateUtil.closeSession();//关闭连接 } //根据学生id查询出学生所在班级信息
public static void findGradeByStudent(int sid){
//执行操作
Session session = HibernateUtil.getSession();
//查询学生
Student student1 = (Student) session.get(Student.class, new Integer(sid)); //使用Integer封装,类才能序列化,变量不能序列化
System.out.println(student1.getSname());
//输出班级信息
System.out.println(student1.getSid() + student1.getGrade().getGname() + student1.getGrade().getGdesc());
//关闭连接
HibernateUtil.closeSession();
} //根据学生班级id,查询出班级中所有学生的信息
public static void findStudentByGrade(int gid){
Session session = HibernateUtil.getSession();
//查询班级
Grade grade = (Grade) session.get(Grade.class, gid);
//查询班级中的学生集合
Set<Student> studentSet = grade.getStudent();
for(Student student : studentSet){
System.out.println("班级id:" + student.getGid());
System.out.println("学生id:" + student.getSid());
System.out.println("学生姓名:" + student.getSname());
System.out.println("学生性别:" + student.getSex());
System.out.println("=============================");
} } }
//设置好关系之后,运行hibernate,hibernate会自动帮我们在数据库中为表关联外键。

hibernate关联关系的更多相关文章
- hibernate关联关系笔记
Hibernate关联关系笔记 单向N:1 * 有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. * 没有连接表:在N方使用& ...
- Hibernate关联关系映射
1. Hibernate关联关系映射 1.1. one to one <class name="Person"> <id name="id" ...
- hibernate关联关系的crud2
hibernate关联关系的CRUD操作,解释都在注释里了,讲了fetchType.cascade. User类: package com.oracle.hibernate; import javax ...
- Hibernate 关联关系(一对多)
Hibernate 关联关系(一对多) 1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B ...
- Hibernate关联关系配置(一对多、一对一和多对多)
第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的 ...
- Hibernate关联关系之双向1—n
•双向 1-n 与双向 n-1 是完全相同的两种情形 •双向 1-n 需要在1的一端可以访问n的一端,反之依然. 测试实例代码: 实体类: package com.elgin.hibernate.nt ...
- Hibernate关联关系之——单向n-1
1 .单向 n-1 关联只需从n的一端可以访问1的一端 2.域模型: 从Order到Customer的多对一单向关联需要在Order类中定义一个Customer属性,而在Customer类中无需定义存 ...
- hibernate关联关系映射详解
词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间 ...
- hibernate关联关系映射之配置文件
词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间 ...
- Hibernate关联关系之多对多
多对多映射关系 建立多对多单向关联关系 创建Employee类: public class Employee { private Integer empid; //员工编号 private Strin ...
随机推荐
- 如何在ajax请求中设置特殊的RequestHeader
现在ajax应用已经相当广泛了,有很多不错的ajax框架可供使用.ajax是一个异步请求,也主要是一种客户端的脚本行为.那么,如何在请求之前为请求添加特殊的一些头部信息呢? 下面是一个简单的例子,我用 ...
- ASP.NET Application Life Cycle
The table in this topic details the steps performed while an XAF ASP.NET application is running. Not ...
- 运行用例时,报错Unknow Error:Element xxx is not clickable……的解决方法
P.S:近期selenium官方更新了版本以解决此问题 通常这种情况是由于在点击该元素时,js更换了元素属性造成的. 所以可以采用js的方式进行处理 方法如下: WebDriver driver = ...
- mysql 分页查询时,如何正确的获取总数
1. 普遍方法: 使用 COUNT(*) ,例如: SELECT COUNT(*) as total FROM studentTask WHERE subjectName = '高中数学'; 缺点: ...
- Qt-网易云音乐界面实现-5 收藏列表,播放列表实现 QListWidget QTableWidget
先上目前完成的内容吧,发现后面越写越多.在看看点击量,心凉凉. 完成了左侧的导航列表,还有就是右下角的播放列表. //创建的歌单 my_Create_Music_List = new QListWid ...
- Linux命令的那些事(三)
回顾linux命令那些事,前面大致总结了常用的Linux命令 回顾Linux命令那些事(一) clear/mkdir/rmdir/ls/rm/pwd/cd/touch/tree/man/--help ...
- 炸!分享美团面试关于selenium的面试题
个人分类: 软件测试 编辑 在这个互联网技术快速迭代的时代,每个测试员都知道技术对于职业发展的重要性,那些技术好的测试员不仅薪资高,而且大多数集中在一线互联网企业工作,让人感觉非常高大上的同时,也想去 ...
- 一文拆解Faas的真实案例
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 刘敏洁:具有多年云计算行业经验,曾任职于华为.UClou ...
- Yii2 输出图片相关
http://www.yiichina.com/doc/api/2.0/yii-web-response#$format-detail https://segmentfault.com/q/10100 ...
- sql语句(Mysql数据库)
Mysql数据库的sql语句: 一.基本操作 1.连接数据库 mysql -uroot -proot -hlocalhost -P3306 (-u表示用户名,-p密码,-h主机,-P端口号) 2.选择 ...