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 ...
随机推荐
- Merge语句中NULL的陷阱
NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是fals ...
- Win10版本号区分
版本号 内部版本号 UniversalApiContract 首个正式版 1507 10240 1 首个重大更新 1511 10586 2 一周年更新 Anniversary Update ...
- loadrunner使用过程中的问题记录
一.录制时选错应用类型,导致提示“loadrunner sockets proxy auto-starter mercury interactive corp.(2002)” 解决办法:重新选择正确的 ...
- 利用Smith圆图设计匹配网络
要实现射频最大的功率传输,必须使负载阻抗与源阻抗相匹配(即信号源阻抗与负载阻抗共轭相等),实现匹配的通常做法是在源和负载之间插入一个匹配网络,该网络不仅仅为减少功率损耗而设计,还可减少噪声干扰.提高功 ...
- python类与对象的内置函数大全(BIF)
关于类与对象的一些常用BIF(内置函数) 1.issubclass(class,classinfo) 含义:如果class是classinfo的子类,则返回True,否则返回false,用来判断子类关 ...
- SICP读书笔记 3.5
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- Python遗传算法工具箱DEAP框架分析
本文主要介绍python遗传算法工具箱DEAP的实现.先介绍deap的如何使用,再深入介绍deap的框架实现,以及遗传算法的各种实现算法. 代码可以参考 https://github.com/suma ...
- IDEA主题设置
主题下载: Color Themes(个人倾向该网站,而不是http://www.riaway.com/) 主题设置: 打开IDEA,按下Ctrl+Alt+S,选择Editor-->Color ...
- 温习DL之一:梯度的概念
1.梯度的概念 梯度是一个矢量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快. 在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写 ...
- CsvReader和CsvWriter操作csv文件
使用方法: 提供把实例数据输出到磁盘csv文件的功能 提供读取csv文件,并封装成指定实例的功能 小工具自己依赖了slf4j+logbak,以及fastJson,如果与系统冲突,可以在pom文件中去除 ...