hibernate多对多关联关系

idea 配置hibernate 多对多关联关系 多对多关联关系是两张表通过第三张表保存多对多的映射关系,通过下面一个例子来解释: 一个用户可以有多个权限,一个权限可以赋予多个用户,由此形成多对多关系,在 MySQL 中建立多对多关系,如下图: 但是多对多关系的表查询是对三个表进行查询,一定程度上会影响性能效率,尽量少用,或转成多对一,一对多的关系进行关联。 下面就这个例子,使用IDEA,进行如下配置: (关于具体如何新建项目等,参看此博文:h... 阅读详情

今天接着来弄一下hibernate的多对多关联关系,多对多在生活中还是比较多的,例如学生和课程,教师和学生等。学习了这么一段时间的hibernate越来越觉得hibernate是个好东西,应该说学习这个上手还是比较快的。还是一样,我会一步一步的写这么一个程序。

1.写2个vo类Student和Course

 

package org.lxh.vo;

import java.util.HashSet;
import java.util.Set;

public class Course {
	private int id;
	private String coursename;
	private Set<Student> student=new HashSet<Student>();  //与其他关联关系不同的是这里的集合必须实例化
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCoursename() {
		return coursename;
	}

	public void setCoursename(String coursename) {
		this.coursename = coursename;
	}

	public Set<Student> getStudent() {
		return student;
	}

	public void setStudent(Set<Student> student) {
		this.student = student;
	}
}

 

 

package org.lxh.vo;

import java.util.HashSet;
import java.util.Set;

public class Student {
	private int id;
	private String name;
    private Set<Course> course=new HashSet<Course>();  //与其他关联关系不同的是这里的集合必须实例化
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Course> getCourse() {
		return course;
	}

	public void setCourse(Set<Course> course) {
		this.course = course;
	}
}


 2.写hibernate映射文件

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.annotations">

    <class name="org.lxh.vo.Student" table="student">

        <id name="id" column="id">
            <generator class="increment"/>
        </id>

        <property name="name" column="name"/>
        <set name="course" inverse="true">
          <key column="stu_id"/>
          <many-to-many class="org.lxh.vo.Course"/>
        </set>
        
    </class> 

</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.annotations">

    <class name="org.lxh.vo.Course" table="course">

        <id name="id" column="id">
            <generator class="increment"/>
        </id>

        <property name="coursename" column="coursename"/>
        <set name="student" inverse="false">
          <key column="course_id"/>
          <many-to-many class="org.lxh.vo.Student"/>
        </set>
        
    </class> 

</hibernate-mapping>

3.写一个Junit测试代码的正确性


package test;

import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import org.lxh.vo.Course;
import org.lxh.vo.Student;

import util.HibernateUtil;


public class TestMany2Many {
   @org.junit.Test public void save()
   {
	   Session ses=null;
   	
   	Transaction tr=null;
   	try{
   		ses=HibernateUtil.getSession();
   		tr=ses.beginTransaction();
   		
   		Course course1=new Course();
   		course1.setCoursename("java程序设计");
   		Course course2=new Course();
   		course2.setCoursename("大学英语");
   		Student stu1=new Student();
   		stu1.setName("chenwill3");
   		Student stu2=new Student();
   		stu2.setName("chenwill4");
   		
   		
   		course1.getStudent().add(stu1);  //把学生添加到集合里
   		course1.getStudent().add(stu2);
   		course2.getStudent().add(stu1);
   		course2.getStudent().add(stu2);
   		
   		
   		
   		//stu1.getCourse().add(course1);  //把课程添加到集合里
   		//stu1.getCourse().add(course2);
   		
   		
   		
   		//stu2.getCourse().add(course1); 
   		//stu2.getCourse().add(course2);
   		ses.save(stu1);  //将student信息保存
   		ses.save(stu2);
   		ses.save(course1);
   		ses.save(course2);
   		
   		
   		tr.commit();      //将事务提交,否侧数据不会被保存
   	}catch(Exception e){
   		e.printStackTrace();
   	}finally{
   		if(ses!=null){
   			ses.close();  //关闭连接,否则会把数据库卡死
   		}
   	}
   }
   
   @org.junit.Test public void query()    //通过课程查询学生姓名
   {
	   Session ses=null;
   	
   	Transaction tr=null;
   	try{
   		ses=HibernateUtil.getSession();
   		tr=ses.beginTransaction();
   		
   		Course course=(Course)ses.get(Course.class, 1);
   		Set<Student> all=course.getStudent();
   		Iterator<Student> it=all.iterator();
   		Student stu=null;
   		while(it.hasNext()){
   			stu=new Student();
   			stu=it.next();
   			System.out.println(stu.getName());
   		}
   	
   		tr.commit();      //将事务提交,否侧数据不会被保存
   	}catch(Exception e){
   		e.printStackTrace();
   	}finally{
   		if(ses!=null){
   			ses.close();  //关闭连接,否则会把数据库卡死
   		}
   	}
   }
}

需要解释一下那个inverse="false",在映射文件里这么写就是说,关联关系由该配置文件对应的vo类维护,例如在Course.hbm.xml里写了inverse="false",那么关联关系就由course维护(也就是说被注释的‘把课程添加到集合’的那段代码不用写)。

下面看一下运行效果图




在这里有2张临时表生成,这2个表用来存储外键。


到这里代码就写好了,我学习hibernate时间还不长,如果有什么地方弄错了,大家尽量丢板砖。

 

Hibernate 关联关系 之 多对多 Hibernate 关联关系 之 多对多Hibernate 多对多关联关系数据库表entity 实体类BookCategoryTreeNodexml 配置book.hbm.xmlcategory.hbm.xmlTreeNode.hbm.xmlhibernate.cfg.xmlDaoBookDaoBookDaoTestTreeNodeDaoTreeNodeTest Hibernate 多对多关联关系... 阅读详情

相关推荐

Hibernate多对多关联添加及查询示例

Hibernate多对多关联添加及查询示例

多对多关联

多对多关联的实现是通过中间表实现的。通过中间表,将这两个表之间的多寻多关联关系转换为它们分别和中间表直接的一对多的关联关系。对于Hibernate来说,并不需要建立专门的中间对象来实现这种转换,但是中间表还是需要建立的。 Hibernate是通过元素来描述对象之间多对多的关系的   Create database many2many; Use many2many; CREATE TABL

xudanna的专栏 664

汽车诊断之UDS入门-0x19 0x0A服务

0x19 0x0A解析

weixin_44842720的博客 3836

Hibernate关联关系(多对多)

数据库的多对多 数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注1:数据库多表联接查询永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左)/right(右)/full(左右)主从表:连接条件不成立时,主表记录永远保留,与null匹配 Hibernate的多对多 Hibernate可以直接映射多对多关联关系(看作两个一对多) 多对多关...

qq_43656358的博客 150

手把手教你排查I2C通信故障:当上拉电阻配置不当会发生什么?

本文深入解析I2C通信中上拉电阻配置不当导致的常见故障,包括波形畸变和通信失败现象。通过示波器波形分析和系统化解决方案,帮助工程师快速诊断和优化I2C总线性能,特别适用于嵌入式系统和智能设备开发场景。

weixin_33725722的博客 340

2023年LitCTF web组wp

1、导弹迷踪2、1zjs3、php是世界上最好的语言!!4、Ping5、我Flag呢?7、作业管理系统8、Vim yyds10、这是什么?SQL!注一下!11、Flag点击就送!12、就当无事发生13、彩蛋。

m0_74160536的博客 1587

hibernate关联关系(多对多)

1. hibernate的多对多 1.1 hibernate可以直接映射多对多关联关系(看作两个一对多) 2. 多对多关系注意事项 2.1 一定要定义一个主控方 2.2 多对多删除 3.2.1 主控方直接删除 3.2.2 被控方先通过主控方解除多对多关系,再删除被控方 3.2.3 禁用级联删除 2.3 关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护 案例: 自关联查询 ...

qiu_hyun的博客 236

【硬件工程师面经整理2_电源篇】

硬件工程师面经整理_电源篇

LeeYLong的博客 2766

Hibernate关联关系之多对多

多对多映射关系 建立多对多单向关联关系 创建Employee类: 1 public class Employee { 2 private Integer empid; //员工编号 3 private String empname; //员工姓名 4 private Set<Project> projects = new HashS...

aao2199的博客 98

MicroCap声学仿真介绍(四)-扬声器仿真

将“障板”模块放置到工作区,“Param:AREAm2=”是指的是障板孔的面积,一般可以输入喇叭的面积Sb;“Param:DISTm=”指的是测试麦克风与障板的距离,这里我们可以填入1米,小喇叭可以填入0.1m;此时工作区的电阻是竖直的,为了方便,我们需要将其变成水平的。其中,频率范围为20~20KHz,仿真点数为500个点,先仿真频响曲线和相位曲线,点击左上角的run,界面如下。鼠标单击工作区,弹出如下界面:在弹出的界面中输入“.define Re 3.82 “,点击”确定“按钮。

山无忧的博客 2994

2026软考中级-软件设计师笔记(送最新视频教程)

核心口诀:运控存输输(运算器、控制器、存储器、输入、输出)例题(2019年上半年):核心公式:数字签名流程:数字证书作用:死锁4个必要条件:死锁判断公式:处理策略:程序设计语言的四大核心成分:顺序表操作(时间复杂度):链表操作(时间复杂度):核心思想:频率高的字符用短编码,频率低的用长编码 → 最小化总编码长度构造步骤(贪心算法):前提:有序表(升序/降序) 步骤:时间复杂度:O(log₂n) 例:查找中核心思想:用哈希函数将关键字映射到存储位置 哈希冲突:不同关键字映射到同一位置 → 用链地址法或开放定址

36万+

Hibernate 框架学习——多对多关联关系映射

多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系。 为了详细介绍多对多关联关系映射,终究还是应以一个例子来说明比较印象深刻。我们以老师和学生的关系为例来说明这种多对多关联关系映射。 双向多对多 我们最好新建...

热心网友 294

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 811

hibernate 多对多关联关系

1.数据库的多对多 数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 2. hibernate的多对多 hibernate可以直接映射多对多关联关系(看作两个一对多) 3 多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不需...

weixin_30477293的博客 91

基于深度学习的水质预测:多参数监测与预测

在本篇博客中,我们详细介绍了如何使用深度学习技术处理水质预测问题,包括数据集的准备与预处理、多层感知机模型的构建、模型的训练与评估以及模型优化策略。我们使用 Python 语言基于 TensorFlow 和 Keras 框架实现了模型,并给出了各种模型优化方法及对应代码。通过实践,我们可以发现深度学习技术在水质预测方面具有很好的应用潜力。在实际应用中,我们还可以根据具体问题和数据集进一步调整和优化模型,以获得更好的预测性能。

斌擎科技 1080

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SSH框架之Hibernate的多对多映射、多对多关联关系维护(inverse)

一、Hibernate的多对多映射 1、需求: 2、代码实现: 1)javabeans以及映射文件的配置 a)Project.java、Project.hbm.xml b)Developer.java、Developer.hbm.xml 2)测试类App1_save.javapackage sram.manyToMany; import org.hibernate.Session;

一点一滴 1706

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Hibernate多对多的关联关系

简单的介绍Hibernate中多对多的关联关系: 一、数据库中不能直接映射多对多(处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多) 二、 hibernate可以直接映射多对多关联关系(看作两个一对多) 注意事项 1 、一定要定义一个主控方 2、 多对多删除 a、 主控方直接删除 b、 被控方先通过主控方解除多对多关系,再删除被控方 c、 禁用级联删除 3、 关联关系编辑,不需要直...

byg 306

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Hibernate多对多关联关系

今天遇到一个问题:有一个的类Reckoning,一个类AccountItem。这两个类之间的关系时多对多的关联关系。 一开始是由AccountItem来维护关联关系的,也就是Reckoning.hbm.xml文件中的如下代码将inverse的值设为true. <set name="accountItems" table="ITEM_RECKONING" inverse="t...

dieyuanjiao9299的博客 132

《Hibernate学习笔记十》:多对多关联关系详解

《Hibernate学习笔记十》:多对多关联关系前面介绍了一对一、多对一和一对多的关联关系在Hibernate应如何实现,这篇博文就来介绍下最后一种关联关系:多对多。多对多关联关系在我们现实生活中的例子实在是太多太多,最典型的就是老师和学生的例子:一个老师可以教多个学生,而一个学生又可以被多个老师来教。了解一点数据库的我们都知道,在数据库中表示多对多的关联关系,是借助于中间表来解决的。如下:还是和以

wojiushimogui的博客 2169
上一篇: hiberbate的一对一关联关系
下一篇: hibernate一对一懒加载
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值