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

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

AX200 iwlwifi-cc-46.3cfab8da.0.tgz 无法下载网页出问题使用 其他方法来进行但是前提还是有网络。

chen20170325的博客 1039

Hibernate关联关系(多对多)

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

qq_43656358的博客 150

告别单一帧:在CFD-POST中完整加载Fluent瞬态计算结果的实战指南

本文详细介绍了在CFD-POST中完整加载Fluent瞬态计算结果的实战指南,解决工程师常见的只能看到最后一帧数据的问题。通过Fluent端的正确设置和CFD-POST端的完整加载技巧,帮助用户高效处理瞬态数据,提升后处理效率。文章还提供了常见问题排查、性能优化和高级后处理技巧,适用于Workbench环境下的流体流动分析。

weixin_29284657的博客 537

脑影像分析入门:如何用一般线性模型(GLM)处理fMRI数据?

本文为神经影像研究入门者详细解析了如何运用一般线性模型(GLM)处理fMRI数据。文章从GLM的核心原理出发,逐步拆解了从实验设计、构建稳健设计矩阵、模型估计与统计推断,到高阶分析及多重比较校正的全流程,并指出了常见陷阱与结果解读要点,是掌握fMRI数据分析基础的关键指南。

weixin_29091445的博客 398

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

Android7以上抓取https数据包-无需root

手机内装一个虚拟机,然后在虚拟机内运行我需要抓包的应用,该虚拟机内是不需要证书验证的。完美解决android7.0以上https无法抓包的问题。

qq_45764684的博客 1454

Hibernate关联关系之多对多

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

aao2199的博客 98

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4160

基于STM32、HAL库的BMP585 气压传感器 驱动程序设计

define BMP585_I2C_ADDR_PRIMARY 0x76 << 1 /* 0x76地址左移一位 */#define BMP585_I2C_ADDR_SECONDARY 0x77 << 1 /* 0x77地址左移一位 *//* I2C句柄 *//* I2C地址 *//* 设置新的温度过采样率 *//* 设置新的滤波器系数 *//* 芯片ID *//* 清除温度过采样位 *//* 转换为hPa *//* 设置新的压力过采样率 *//* 设置新的电源模式 *//* 清除压力过采样位 */

corlin6688的博客 459

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

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

热心网友 294

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

hibernate 多对多关联关系

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

weixin_30477293的博客 91

Qt代码-军用仿真系统基础框架

ui->mapClickLabel->setText(QString("地图点击:(%.1f, %.1f)米").arg(worldPos.x()).arg(worldPos.y()));emit simulationEvent(QString("添加实体: %1 (ID: %2)").arg(attr.name).arg(entity.id()));// 像素坐标→世界坐标(米)

寒寒豆豆软件公司的博客 168

精雕软件(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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Hibernate多对多的关联关系

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

byg 306

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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、付费专栏及课程。

余额充值