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关联关系的更多相关文章

  1. hibernate关联关系笔记

    Hibernate关联关系笔记 单向N:1 *  有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. *  没有连接表:在N方使用& ...

  2. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  3. hibernate关联关系的crud2

    hibernate关联关系的CRUD操作,解释都在注释里了,讲了fetchType.cascade. User类: package com.oracle.hibernate; import javax ...

  4. Hibernate 关联关系(一对多)

    Hibernate 关联关系(一对多) 1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B ...

  5. Hibernate关联关系配置(一对多、一对一和多对多)

    第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的 ...

  6. Hibernate关联关系之双向1—n

    •双向 1-n 与双向 n-1 是完全相同的两种情形 •双向 1-n 需要在1的一端可以访问n的一端,反之依然. 测试实例代码: 实体类: package com.elgin.hibernate.nt ...

  7. Hibernate关联关系之——单向n-1

    1 .单向 n-1 关联只需从n的一端可以访问1的一端 2.域模型: 从Order到Customer的多对一单向关联需要在Order类中定义一个Customer属性,而在Customer类中无需定义存 ...

  8. hibernate关联关系映射详解

    词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间 ...

  9. hibernate关联关系映射之配置文件

    词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间 ...

  10. Hibernate关联关系之多对多

    多对多映射关系 建立多对多单向关联关系 创建Employee类: public class Employee { private Integer empid; //员工编号 private Strin ...

随机推荐

  1. 提高你的Python编码效率的“武林秘籍”

    我用Python编程有几年了, 并且我仍然经常惊讶于Python代码可以如何的简洁,如何的 DRY . 我学到了很多小贴士和技巧,大多数来自于阅读开源项目的源代码,像Django, Flask, Re ...

  2. H5拖拽 构造拖拽及缩放 pdf文件转换为html预览

    前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...

  3. 关于selenium的智能等待页面加载的问题

    我们经常会碰到用selenium操作页面上某个元素的时候,需要等待页面加载完成后,才能操作, 否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后,才能操作. 首 ...

  4. Xming 多屏选项

    最早接触xming是从GrADS软件弹出的那个窗口开始的.到后来发现它是一个显示图形界面的软件,设置multiwindow 选项,xshell+xming连远程服务器,屡试不爽.随着设备升级,用上了双 ...

  5. CAN总线的显性电平为什么能覆盖隐性电平?

    摘要:在CAN总线中,显性电平是强驱动,隐性电平时弱驱动,因此当有的节点发送显性电平有的节点发送隐性电平时,总线上呈现的肯定是强驱动的状态,这就是CAN总线显性电平可以覆盖隐性电平的原因. 大家都知道 ...

  6. Android Library和Android APP、Java Library的区别

    Android Library和Android APP.Java Library的区别 Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码. ...

  7. ats Linux路由器上内联

    路由设置假定客户端集在单个物理接口后面的不同网络上. 出于本例的目的,我们将假设: 客户端位于172.28.56.0/24网络上路由器连接网络172.28.56.0/24和192.168.1.0/24 ...

  8. Extreme Learning Machine 翻译

    本文是作者这几天翻译的一篇经典的ELM文章,是第一稿,所以有很多错误以及不足之处. 另外由于此编辑器不支持MathType所以好多公式没有显示出来,原稿是word文档. 联系:250101249@qq ...

  9. Erlang数据类型的表示和实现(2)——Eterm 和立即数

    Erlang 数据类型的内部表示和实现 Erlang 中的变量在绑定之前是自由的,非绑定变量可以绑定一次任意类型的数据.为了支持这种类型系统,Erlang 虚拟机采用的实现方法是用一个带有标签的机器字 ...

  10. LeetCode 566. Reshape the Matrix (C++)

    题目: In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a n ...