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 也超越了 Java 成为了第一,挺替 Python 开 ...

  2. 如何为一个高负荷站点配置tomcat连接器(connector)【译文】(第一篇)

    引言 最近正好要用到这些内容,因此就找了一篇比较有分量的文章,思来想去,还是尝试写一下译文吧.其实LZ的英语是非常烂的(四级没过的LZ眼泪掉下来),因此这篇文章翻译的水平LZ自己也不敢恭维.各位猿友大 ...

  3. 【Python Learning第一篇】Linux命令学习及Vim命令的使用

    学了两天,终于把基本命令学完了,掌握以后可以当半个程序员了♪(^∇^*) 此文是一篇备忘录或者查询笔记,如果哪位大佬看上了并且非常嫌弃的话,还请大佬不吝赐教,多多包涵 以下是我上课做的一些笔记,非常的 ...

  4. 2018年美国大学生数学建模竞赛(MCM/ICM) B题解题思路

    老套路,把我们在解决B题时候采用的思路分享给大家,希望大家能学到点东西~~~ B题思路整理:Part1:先整理出说某种语言多的十个国家给找出来,或者说是把十种语言对应的国家找出来 然后再对各个国家的人 ...

  5. 简单字典实现(KV问题)

    搜索二叉树基本概念请看上篇博客 这两个问题都是典型的K(key)V(value)问题,我们用KV算法解决. 判断一个单词是否拼写正确:假设把所有单词都按照搜索树的性质插入到搜索二叉树中,我们判断一个单 ...

  6. jmeter发送http请求(初学者)

    1.jmeter安装配置(百度,这里就不赘述了) 2.添加线程组 测试计划-->添加-->Threads-->线程组 3.线程组配置 线程数:用户数或者并发数,设置为100则有100 ...

  7. VMware Workstation and Device/Credential Guard are not compatible

    VMware Workstation and Device/Credential Guard are not compatible. VMware Workstation can be run aft ...

  8. c语言数字图像处理(七):频率域滤波

    代码运行了两个小时才出的结果,懒得测试了,这一部分先鸽了,等对DFT算法进行优化后再更

  9. Babylon.js官方性能优化文档中文翻译

    在这里列出Babylon.js官方性能优化文档的中英文对照,并在CardSimulate项目里对其中的一些优化方法进行实践. How To 如何 Optimize your scene 优化你的场景 ...

  10. Netty源码分析第2章(NioEventLoop)---->第3节: 初始化线程选择器

    Netty源码分析第二章:NioEventLoop   第三节:初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multi ...