Hibernate之一对多关联

一对多关联分单向一对多关系 和双向一对多关系 ;

  • 单向一对多关系:

实例:User和Courses关系,一个User可以同时拥有多个Courses;而User所选的Courses只能属于它的主人;他们的关系是:主控方---User,被倥方---Courses;

TUser:

public class TUser implements java.io.Serializable {
	private static final long serialVersionUID = 1L;

	private Integer userid;
	private String name;
	private Set<TCourses> courses;
        get()/set()
}

 TCourses:

public class TCourses implements java.io.Serializable {
	private static final long serialVersionUID = 1L;

	private Integer coursesId;
	private String name;
        get()/set()
}

 TUser.hbm.xml:(对于一对多的关系,我们可以用java.util.Set()类型的Collection,在XML中的表现就是<set></set>),为了保持关联关系,我们需要在主控方配置级联关系;

<hibernate-mapping package="com.keith.one2many.uni">
	<class name="TUser" table="TUser" dynamic-update="true" dynamic-insert="true">
		<id name="userid">
			<generator class="native"/>
		</id>
	
		<property name="name" />
		
		<set name="courses" cascade="all">
			<key column="user_id"></key>
			<one-to-many class="TCourses"/>
		</set>	

	</class>	

 Tcourses.hbm.xml:

<hibernate-mapping package="com.keith.one2many.uni">
	<class name="TCourses" table="TCourses">
		<id name="coursesId">
			<generator class="native"/>
		</id>
	
		<property name="name" />
	</class>	
</hibernate-mapping>

 测试方法:

//添加数据
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();

		TCourses courses1 = new TCourses();
		courses1.setName("java");
		TCourses courses2 = new TCourses();
		courses2.setName("linux");
		TCourses courses3 = new TCourses();
		courses3.setName("OS");
		
		Set<TCourses> courseses = new HashSet<TCourses>();
		courseses.add(courses1);
		courseses.add(courses2);
		courseses.add(courses3);
		
		TUser user = new TUser();
		user.setName("keith");
		user.setCourses(courseses);
		
		session.save(user);
		session.getTransaction().commit();

 看下Hibernate给我们的展现的SQL:

--创建数据库TCourses
    create table TCourses (
        coursesId integer not null auto_increment,
        name varchar(255),
        user_id integer,
        primary key (coursesId)
    )
--创建数据库TUser
    create table TUser (
        userid integer not null auto_increment,
        name varchar(255),
        primary key (userid)
    )
--设置关系
    alter table TCourses 
        add index FKB23474C41422125 (user_id), 
        add constraint FKB23474C41422125 
        foreign key (user_id) 
        references TUser (userid)

--插入数据
Hibernate: insert into  TUser(name) values(?)
Hibernate: insert into  TCourses(name) values(?)
Hibernate: insert into  TCourses(name) values(?)
Hibernate: insert into  TCourses(name) values(?)
Hibernate: update  TCourses set  user_id=? where coursesId=?
Hibernate: update  TCourses set  user_id=? where coursesId=?
Hibernate: update  TCourses set  user_id=? where coursesId=?

  •  双向一对多关联

双向一对多的关系是“一对多”与“多对一”关联的组合,所以我们必须在主控方配置单向一对多关系的基础上,在被动方配置与其对应的多对一关系;

我们只需在被倥方进行修改即可;

TCourses:

public class TCourses implements java.io.Serializable {
	private static final long serialVersionUID = 1L;

	private Integer coursesId;
	private String name;
	private TUser user;
        get()/set()
}

 TCourses.hbm.xml:

<hibernate-mapping package="com.keith.one2many.doubleSide">
	<class name="TCourses" table="TCourses">
		<id name="coursesId">
			<generator class="native"/>
		</id>
	
		<property name="name" />
		<many-to-one name="user" column="user_id" class="TUser"/>
	</class>	
</hibernate-mapping>

测试代码(添加数据):

		// 新增用户
		 TUser user = new TUser();
		 user.setName("keith");
		 session.save(user);

		// 为用户增加课程,主动端操作
		 TUser user= (TUser) session.load(TUser.class, 1);
		 TCourses courses = new TCourses();
		 courses.setName("java");
		 user.getCourses().add(courses);
		 session.save(user);

		// 为用户增加课程,被动端操作
		 TUser user = (TUser) session.load(TUser.class, 1);
		 TCourses courses = new TCourses();
		 courses.setName("OS");
		 courses.setUser(user);
		 session.save(courses);

 查询:

		// 通过user 查询courses
		TUser user = (TUser) session.load(TUser.class, 1);
		System.out.println("user's name:" + user.getName());
		TCourses courses = null;
		Iterator<TCourses> it = user.getCourses().iterator();
		while (it.hasNext()) {
			courses = it.next();
			System.out.println("user's courses:" + courses.getName());
		}
		//通过courses查询user
		TCourses courses = (TCourses) session.load(TCourses.class, 2);
		System.out.println(courses.getUser().getName());
 

看下建表SQL:

10:07:54,209 DEBUG SchemaExport:377 - 
    create table TCourses (
        coursesId integer not null auto_increment,
        name varchar(255),
        user_id integer,
        primary key (coursesId)
    )
10:07:54,212 DEBUG SchemaExport:377 - 
    create table TUser (
        userid integer not null auto_increment,
        name varchar(255),
        primary key (userid)
    )
10:07:54,217 DEBUG SchemaExport:377 - 
    alter table TCourses 
        add index FKB23474C46B6EDEB3 (user_id), 
        add constraint FKB23474C46B6EDEB3 
        foreign key (user_id) 
        references TUser (userid)

 附上代码;

【SSH进阶之路】Hibernate映射——一对多关联映射(七) 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,一端维护多端的关系,在加载一端时,可以将多端加载上来。 阅读详情

相关推荐

从入门到精通:MediaGo跨平台部署全攻略,Docker+NAS实战案例深度拆解!

本篇将深入解析开源媒体处理工具MediaGo的运作机制,该软件具备跨平台兼容性,支持Windows、MacOS及Linux三大主流操作系统。其核心创新在于采用模块化架构设计,用户无需额外依赖任何插件即可完成快速部署。作为GitHub平台上的开源项目,该工具特别注重用户体验设计,通过Docker容器化方案可无缝接入各类网络存储设备,显著优化系统资源占用并提升数据处理效率。以飞牛云NAS系统为实施案例,本文将详细展示本地化部署全流程。

Yawesh的博客 1954

Hibernate入门第十讲——Hibernate的一对多关联映射

Hibernate关联映射——一对多(多对一)我们以客户(Customer)与订单(Order)为例来讲解Hibernate关联映射中的一对多关联关系。 首先肯定是搭建好Hibernate的开发环境,我在此也不过多赘述,读者自行实践。接着在src目录下创建一个cn.itheima.oneToMany包,并在该包下创建两个实体类,如下: 客户类// 客户 ---- 一的一方 public class

李阿昀的博客 1万+

告别臃肿VS!仅用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境

本文详细介绍了如何仅使用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境,避免安装臃肿的完整VS。通过精准选择组件、配置Qt Creator编译器和优化Kit设置,实现高效、精简的Windows平台Qt开发环境搭建,特别适合追求性能和资源优化的开发者。

weixin_30340617的博客 350

Hibernate一对多关联

首先是实体类: TAddress.java(多的一方) public class TAddress implements Serializable { private static final long serialVersionUID = 1121137857691229229L; private Integer id; pri

huihui_IT的博客 564

逆向攻防世界CTF系列40-ReverseMe-120

注意sub_401000main中只传了两个参数,但是跟进后发现四个(可能是隐式传递,放在寄存器里传递了),调试发现a4是输入长度,与最终的you_know_how_to_remove_junk_code比较的是v12(但是并没有被传入),开始怀疑是不是隐式传递了。_mm_xor_si128用于计算128位(16字节)的按位异或,然后通过v14控制循环结束的条件,可以看到v14增长的步长为16,而且通过上面得到的flag值解码得到的字符串为32个字节大小,正好是16的整数倍。

LH1013886337的博客 1410

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑

本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。

weixin_42638178的博客 391

Hibernate之单向一对多关联的实现

        单向的一对多关联映射关系主要是通过外键来关联的。一对多的关联映射是在表示“多”的一方的数据表中增加一个外键,并由“一”的一方指向“多”的一方。        单向一对多关联的持久化类里需要包含一个集合属性,在“一”的一方访问“多”的一方时,“多”的一方将以集合的形式来体现。如一个用户对应多个地址,则在grade类的定义中会包含一个集合属性,该属性就用来保存多个student实体。 ...

qq_33174994的博客 1683

避坑指南:LAMMPS做GCMC模拟时,化学势mu和压力p到底怎么设?

本文详细解析了LAMMPS中巨正则蒙特卡洛(GCMC)模拟的关键参数设置,特别是化学势(mu)与压力(p)的正确计算方法。通过理论分析、实用公式和黄金法则,帮助用户避免常见误区,提升模拟精度和效率,适用于各类复杂体系的分子模拟研究。

weixin_42525289的博客 429

hibernate双向一对多关联

hibernate双向一对多关联,在一端维护和多端维护

陈俊的马蹄印 469

LE AUDIO---Volume Control Service

LE AUDIO---Volume Control Service

weixin_42162924的博客 163

Modbus协议全家桶(C#纯原生完整版):ModbusRTU + ModbusTCP + ModbusASCII 协议规范+完整封装+工业级实战

你已经掌握了C#串口/网口原生核心API和工业通信协议本质,而今天的主角Modbus协议,是工业通信领域绝对的王者、通用的标准、入门的必修课,没有之一。凡是做工业通信开发,必会Modbus协议;市面上99%的工业设备(PLC、变频器、温控仪、传感器、流量计、扫码枪)都原生支持Modbus协议。Modbus协议不是单一协议,而是一个「协议家族」,我们常说的就是这个家族的三大核心成员,也是工业现场的全部Modbus应用形态。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 563

Hibernate之一对多关联映射

Hibernate之一对多关联映射

梦想起飞的地方,必须用心去经营 1491

实现边缘实时动物检测:YOLOv5模型优化与树莓派4B部署全攻略

本文介绍了基于高性能计算机训练YOLOv5目标检测模型,并部署到树莓派4B实现实时动物检测的全流程。主要内容包括:1)在高性能计算机上通过Anaconda创建虚拟环境,安装YOLOv5项目并进行模型训练;2)将训练好的best.pt模型迁移到树莓派,配置轻量级Miniconda环境;3)连接树莓派摄像头,运行实时检测程序。该系统兼顾了训练效率和边缘设备部署的实用性,可广泛应用于智慧农业、生态监测等场景。文中详细说明了数据准备、环境配置和部署步骤,为开发轻量级目标检测系统提供了完整参考方案。

m0_64661770的博客 201

Hibernate自身双向一对多关联

自身双向一对多关联其实是双向一对多(如CustomerOrder)的特殊情况,以Category为例: (1)Category类的类框图: (2)CATEGORIES表的结构: (3)持久化类Category: package Bean; import java.util.Set;   publicclassCategory {     private Longid

robbinBlog 441

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Hibernate单边一对多关联

单边一对多指一方中有集合属性,包含有多个对方,另一方中没有一方的引用。 本例使用的是人与qq账号作为举例,一个人可以有多个qq账号。每个qq账号只对应一个人。这一类例子比较多,本文只是一个举例而已。 1、新建java工程 2、添加hibernate特性相关的库和MySql相关的jar包 本文使用MyEclipse自动向工程添加hibernate相关的库,使用方法如下:

三言两语 852

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java之hibernate之单向的一对多关联映射

这篇主要讲hiberante中的 单向一对多关联映射 1.在应用中,有时候需要从一的一端获取多的一端的数据。比如:查看某个分类下的所有书籍信息;查看某个订单下的所有商品等。 2.在一对多的关联关系中,表的设计为: 从表的设计中可以看出,表结构和多对一的表结构相同 3.类的设计 Book.java public class Book implements Serializa...

weixin_30949361的博客 86

OV9734 DATASHEET,完整规格书

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

【Hibernate】一对多关联映射

前两篇博客介绍了多对一和一对一关联映射,这篇博客介绍一对多关联映射,它的原理和多对一关联映射的原理是一样的,都是在多的一端加入一个外键,指向一的一端。下面详细介绍相关内容: 一、单向一对多     一对多的关系我们用学生和班级来说,一个班级有多个学生,多个学生可能属于一个班级,他们的对象模型和关系模型如下:     在进行关系映射时需要在一的一端添加标签,另外还需要在一的一端

颗粒归仓 519

Hibernate一对一关联映射和一对多关联映射

一对一关联映射     一对一是指两个对象之间是一对一的关系,在Hibernate中使用的标签是标签,这种关联映射可以采用两种策略实现,一种是主键关联,让两个对象具有相同的主键值,数据库表不会有其他的字段来维护他们之间的关系,仅仅通过主键来关联。另一种就是唯一外键关联,从上一篇博客来看,外键关联是多对一的关联映射方式,但是将外键设置为唯一之后,就可以表示一对一的关联关系。 下面我们分别分析这两

致力于顶级java全栈工程师 1041

Hibernate中的一对多关联技术

Hibernate中的一对多关联技术 【创建数据库脚本】 DROP TABLE IF EXISTS subitem; DROP TABLE IF EXISTS item; CREATE TABLE item( iid INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(50) ); CREATE TABLE subitem( sid INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(

Nicholas_GUB的博客 312

hibernate---->一对多关联映射

一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站的角度不同 在一端维护关系的缺点: * ...

100

Hibernate框架-05-01-单向一对多关联映射

文章目录实体一对多关联数据库一对多关联Hibernate单向一对多关联XML形式配置注解形式配置Hibernate双向一对多关联XML形式配置注解形式配置 实体一对多关联 例如部门与职工之间的关系,就是一对多 购物网站,用户与订单之间关系就是一对多 第一种存储多个对象的类型是Set类型。 数据库一对多关联 Hibernate单向一对多关联 XML形式配置 注解形式配置 Hibernate双向一对多关联 XML形式配置 注解形式配置 ...

异侠 415

《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射

目录一:一对多关联概念1.实体一对多关联(1:n)2.数据库一对多关联二:Hibernate实现单向一对多关联1.xml配置实现 一:一对多关联概念 1.实体一对多关联(1:n) 定义: 如果对于实体集A中的每一个实体,实体集B中有n个实体(n>=0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1:n。 实例:一个班级中有若干名学生,每个学生只在一个班级中学习。 示例:在一些购物网站中,用户和订单之间的关系就是一对多关联关系

池鱼 413

Hibernate 一对多关联查询:实现与优化

Hibernate通过实体类和映射文件的配置,可以方便地实现一对多关联查询。通过合理使用HQL和`fetch`策略,可以优化查询性能,减少数据库访问次数。希望本文能帮助你更好地理解和使用Hibernate的一对多关联查询

Myqijiahai的博客 449

hibernate 一对多关联

1.映射文件 一 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-m...

weixin_34388207的博客 72

在hibernate中如果一对多关联,并以多的一方的参数作为条件则必须使用

public Data findDiectorByFilmId(Long filmId) { Data rows = directorDao.findRows("select new FilmDirector(fd.id as id,fd.chName as chName,fd.enName as enName,fd.birthDate as birthDate,fd.birthplace a

当太阳升起时,你最好开始奔跑。 1870
上一篇: 获取java.sql.ResultSet大小
下一篇: Hibenrate之多对多关联
keithJava
博客等级 码龄16年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值