Java EE SSH框架之hibernate(3)—— hibernate中的一对多和多对多

Java EE博客网站开发实战:SSH框架与MySQL整合 博客网站的架构设计通常遵循MVC(Model-View-Controller)模式,可以分为表示层、业务层和持久层。表示层负责与用户直接交互,如展示博客文章、用户评论等;业务层处理博客的具体业务逻辑,例如文章的发布、编辑和管理;持久层主要负责数据的持久化存储,以及与数据库的交互。 阅读详情

    本篇总结了一对多和多对多关系的在数据库表中和实体中的表达,级联操作(cascade),关系的维护(inverse)!


一、一对多

1.1、一对多关系的表达

表中的表达(在一对多的表中,外键指向一的那一方的主键):

    看下图的两张表,客户表与联系人表的关系是一对多。客户表的id是主键,在联系人表中是cid,即外键所以联系人表的外键指向了客户表的主键。

实体中的表达:



下面用代码演示客户与联系人之间的关系(本例中没有手动去建数据库表):

    先分别创建实体类Customer和LinkMan:

 

hibernate的主配置文件中加入两行:


1.2、不用级联操作

hibernate映射文件:

Customer.hbm.xml



LinkMan.hbm.xml

(上述在配置一对多和多对一的时候属性名都是一样的,其中要注意的是column属性的值要是一样的外键列名即lm_cust_id)


写一个方法测试一下:

package com.zl.one2many;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.zl.domain.Customer;
import com.zl.domain.LinkMan;
import com.zl.utils.HibernateUtils;

public class TestOne2Many {
	@Test
	public void fun1() {  //保存客户以及客户下的联系人
		//1.获得session
		Session session = HibernateUtils.openSession();
		//2.开启事务
		Transaction tx = session.beginTransaction();
		
		//3.操作
		Customer c = new Customer();
		c.setCust_name("Baidu公司");
		
		LinkMan lm1 = new LinkMan();
		lm1.setLm_name("李彦宏");
		LinkMan lm2 = new LinkMan();
		lm2.setLm_name("陆奇");
		
		//表达一对多,客户下有多个联系人
		c.getLinkMens().add(lm1);
		c.getLinkMens().add(lm2);
		
		//表达多对多,联系人属于哪个客户
		lm1.setCustomer(c);
		lm2.setCustomer(c);
		
		session.save(c);
		session.save(lm1);
		session.save(lm2);
		
		//4.提交事务
		tx.commit();
		//5.关闭资源
		session.close();
	}
}

控制台打印:


数据库中:

customer表:


linkman表:



在多的一方添加一条记录:


数据库linkman表中已添加了一条记录:



为客户移除掉刚刚添加的联系人:



为了下面的测试,我删除了这两张表,当然,不删也可以看出来效果


1.3、使用级联操作——cascade属性

级联操作:cascade  —— 简化操作

save-update:级联保存更新     delete:级联删除       all:save-update + delete


级联保存更新

在Customer.hbm.xml中配置 :


测试级联保存:


数据库表中:



除了通过保存客户来级联保存联系人之外,也可以通过保存联系人来级联保存客户,这时就需要级联操作cascade属性配置在LinkMan.hbm.xml里了

<many-to-one name="customer" column="lm_cust_id" class="Customer" cascade="save-update" ></many-to-one>

数据库表:



级联删除

在Customer.hbm.xml中配置 :


测试级联删除:


数据库表中不仅客户被删除了,联系人也被删除了:



在开发中,级联操作是为了简化操作,也可以不用,若一定要使用级联操作的话,就用save-update,不建议使用delete!


1.4、关系维护——inverse属性

上述不使用级联操作,保存客户和联系人,控制台打印的SQL语句:



在保存时,默认情况下,两方都会维护外键关系,关系维护两次,冗余了。上述多余的维护关系语句(最后两句),显然是客户这一方。

inverse属性:inverse属性优化了性能,配置该类是否来进行关系维护,true:不维护关系,false——维护关系,默认为false。

inverse属性的原则——无论怎么放弃,总有一方必须来维护关系。在一对多的关系中,一的一方放弃。也只能一的一方放弃,多的一方不能放弃!

下面我们来配置让Customer(一的一方)放弃维护外键:


测试代码里:

控制台打印(没有客户维护外键语句):




二、多对多

2.1、关系的表达

表中的表达(使用中间表,至少两列,都是外键列,分别引用两张表的主键):

 员工表:       角色表:  

两张表的主键组合成一张中间表把两张表关联起来:



实体中的表达(两方都使用集合来表达拥有多个对方):

员工类:

角色类:



ORM元数据 配置文件中的配置多对多关系:





2.2、多对多中关系的维护——inverse属性

    inverse属性与一对多中的一样,true表示放弃维护外键关系,false表示维护关系。

    在开发中遇到多对多关系,必须选择一方放弃维护关系,谁来维护关系谁放弃维护要看业务方向。

    上例中,录入员工时,需要为员工指定所属角色,那么业务方向就是由员工维护角色,角色不需要维护与员工的关系,所以,角色放弃维护关系!所以需要在Role.hbm.xml里面配置inverse属性:



主配置文件里添加:


编写测试类:

public class TestMany2Many {
	@Test
	public void fun1() {  //添加员工、添加角色,并维护两者之间的关系
		//1.获得session
		Session session = HibernateUtils.openSession();
		//2.开启事务
		Transaction tx = session.beginTransaction();

		//3.操作
		//创建Employee和Role对象
		Employee e1 = new Employee();
		e1.setEmployee_name("张山");
		Employee e2 = new Employee();
		e2.setEmployee_name("李市");
		
		Role r1 = new Role();
		r1.setRole_name("老板");
		Role r2 = new Role();
		r2.setRole_name("程序员");
		Role r3 = new Role();
		r3.setRole_name("UI");
		
		//用户表达关系,关系只用一方维护
		e1.getRoles().add(r1);
		e1.getRoles().add(r2);
		e2.getRoles().add(r2);
		e2.getRoles().add(r3);
		
		session.save(e1);
		session.save(e2);
		session.save(r1);
		session.save(r2);
		session.save(r3);
		
		//4.提交事务
		tx.commit();
		//5.关闭资源
		session.close();
	}
}

员工表:       角色表:   中间表:


测试:给某个员工解除某个角色

只有中间表少了第一行  1   1,其他两个表没有变化!




2.3、多对多中的级联操作

例:给上例中id为1的员工添加一个新角色:


数据库中,role表和中间表都多了一条记录:

   


给Employee添加级联操作cascade属性

这样在测试的时候,r1就不用我们手动去save了,即上面测试代码截图的最后一行可以注释掉


    cascade属性简化了代码的属性,该属性也是可选属性,在开发中,一般也就会用到save-update值,用delete太危险了,在多对多中,不建议用!


精通SSH框架:Struts2+Spring2+Hibernate3综合指南 本文还有配套的精品资源,点击获取 简介:Struts2、Spring2 和 Hibernate3 组合形成了 Java Web 开发中的“SSH”三位一体,提供了完整的模型-视图-控制器(MVC)架构、事务管理和数据持久化解决方案。本课程旨在介绍这三个框架的核心概念、配置方法和在企业级应用中的协同工作方式,帮助开发者提升开发效率和系统的可维护性。 1. Strut... 阅读详情

相关推荐

从Stereo-seq原始数据到Seurat对象:华大空间转录组分析流程实战解析

本文详细解析了从Stereo-seq原始数据到Seurat对象的完整分析流程,重点解决华大空间转录组数据处理中的三大痛点:bin_size参数设置、批量处理内存管理及格式转换信息丢失。通过Python的stereopy库和R的SeuratDisk包,实现.gem到.h5ad再到.h5seurat的高效转换,为研究者提供了一套可复用的空间转录组分析解决方案。

weixin_30315723的博客 218

springboot集成通用mapper

pom.xml //不要它 <!-- <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</versi...

weixin_43887789的博客 371

5QI(5G QoS Identifier)

此外,5QI与网络切片(Network Slicing)密切相关,网络切片允许网络运营商在物理网络内部创建虚拟网络,为不同的客户和用例提供定制化服务和QoS。5QI(5G QoS Identifier)在5G网络中用于标识不同的服务质量要求,它允许网络对不同的数据流进行优先级划分和资源分配。:5QI的实施需要对5G网络的QoS参数有深入的理解,包括延迟、吞吐量、数据包丢失率等,这对技术人员提出了较高的要求。不是所有的5G设备都支持5QI的全部功能,这可能会限制5QI应用的广泛性。

记录有价值的内容 6533

JAVA实现存在更新不存在插入与及多余的进行删除

合并插入与删除

阿文的专栏 2275

自偏置电流镜设计实例

自偏置电流镜设计实例 一、概述 ​ 众所周知,电流镜属于模拟电路设计中的一个基本模块,可为其他模块提供偏置电流,例如在放大器中提供偏置电流以形成尾电流源并确定直流偏置点。本文将会介绍一种自偏置的电流镜,从原理出发,并以0.18um的工艺进行设计和仿真。 二、原理 ​ 如图一所示的电路,也称之为Beta-multiply reference电路,其中M2的尺寸是M1的k倍。M3复制M4的电流,M2和M1的漏极电流相同,但是VGS并不相等。其中 VGS=2IμnCoxW/...

aonuanjiang的博客 1万+

Xilinx Aurora 8B/10B IP核详解和仿真

Xilinx Aurora 8b/10b IP核的详解,以及使用与仿真示例,对IP核的配置和如何仿真有非常详细的说明,除了对IP核官方文档的内容进行了解析以外,还对GTX引脚的选择等比较容易混淆和不好理解的地方进行了说明。最后对IP核的仿真运行进行了STEP BY STEP 的说明,对仿真的结果也进行了简要的说明。 该文档对Xilinx FPGA和ZYNQ SOC下 AURORA 8B/10B IP核的使用提供了一个快速上手的指导。

weixin_43354598的博客 1万+

SSH中pojo内的外键的设置与声明(一对多关系)

以我的系统为例,一个admin对应着多个article,数据库表中article中的admin_id就是admin表的外键,对应着admin中主键id。如图所示: 在eclipse中pojo包下的编写如下: Admin.java @OneToMany(mappedB...

Akita·Wang's Semantic Segmentation 391

专题一:Labview表格控件 及 应用(三)在表格中插入一行数据

专题一:Labview表格控件 及 应用(三) 在表格中插入一行数据 最近一段时间,做试验台上位机编程,老是用到表格控件,这几天抽时间专门写一个表格控件的专题。有用到的朋友可以参考一下。 今天接着讲一下,表格控件的数据插入,和相关的操作 1.表格控件的数据插入原理: 表格控件是一个 2D 字符串数组。 在表格插入一行,就是在2D数组插入一行。 行、列插入类似** 以下以成绩录入为例说明 2.1 不要表头直接插入 知识点1:创建数组:把数学,语文,英语三个数值,连成一个一位数组(数值型)。 知

Labview十年工控_702老师的博客 1万+

Hibernate 一对多关系中,当根据一的id添加多的一方时,出现多的一方重新执行插入空数据

在做客户关系管理例子中,客户与联系人是一对多的关系,,实现联系人新增,当根据客户id新增联系人时,发现联系人是保存成功的,但原有的该客户信息变为空(只有id在),在后台不仅执行了联系人的插入,并且执行了客户的插入 原有客户列表如下: 根据id为4的客户插入联系人后的客户列表如下: 最后发现在orm元数据的配置中客户与联系人的xml中都写了级联与懒加载,只要将联系人的级联与懒加载去掉,...

JaneCao_666的博客 1041

树莓派通过TTL3.3转485 Modbus采集水表

所需道具 树莓派0,我用的是树莓派zero wh; 具有光电直读功能的有线水表,我用的是咸鱼淘的埃美柯LXSY-20E1; TTL3.3 转 485模块,带隔离的贵些; 5V转12V升压模块。 原理 树莓派有UART(GPIO14 Tx 和 GPIO15 Rx)串口通讯功能,电器特性是3.3V TTL,直读远传水表支持M-Bus/485通讯接口,我买的光电直读水表485要求12V供电(根据仪表厂家说明书)。TTL和485虽然都是串口通讯,但电器特性不一样,不能直接接!我已经烧掉一个树莓派...

xhydongda的博客 3443

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2175

【SSH】Hibernate学习(三)一对多、多对一、多对多

一、一对多,多对一

麦客子 1620

自考计算机系统原理(第六章计算机系统概论)-13015

名词解释 I/O 硬件 I/O软件 用户空间I/O软件 内核空间I/O 软件 系统调用处理程序 系统调用服务例程 设备驱动程序 中断服务程序 系统级1/O函数 虚拟文件系统 文件描述符 文件元数据 流缓冲区 索引节点 目录文件 目录项 系统打开文件表 磁盘高速缓存 高速缓存 RAM I / O 控制方式 程序直接控制I/O 就绪状态 中断控制I/O 中断屏蔽字 多重中断 中断嵌套 DMA 方式 DMA 控制器 设备控制器 I/O端口 控制端口 数据端口 状态端口 I/O 地址空间 独立编址方式 统一编址方

qq_23872947的博客 1150

java系列:什么是SSH?什么是SSM?SSH框架和SSM框架的区别

什么是SSH?什么是SSM?SSH框架和SSM框架的区别

weixin_54626591的博客 5243

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Devexpress16.2.6破解工具

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

SSH框架总结

传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使的程序结构分为几层,有负责前台展示的 JSP、负责流程逻辑控制的Servlet以及负责数据封装的Javabean。但是这种结构仍然存在问题:如JSP页面中需要使用符号嵌入很多的 Java代码,造成页面结构混乱,Servlet和Javabean负责了大量的跳转和运算工作,耦合紧密...

咕咕怪的博客 5294

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SSH框架总结,超详细

2.1 什么是struts从简单性来看,Struts是这三个框架中最简单的一个,它是基于MVC的框架。它通过采用JavaServlet/JSP技术,实现了基于Java EEWeb应用的MVC设计模式的应用框架,是MVC的一个具体实现或着说是MVC的一个具体产品。2.2 Struts的核心构成Struts的核心同样也是MVC的核心,Struts是MVC的一个具体产品。(1)Model。

weixin_43696483的博客 8699

Java框架总结

本系列用来记录常用java框架的基本概念、区别及联系,也记录了在使用过程中,遇到的一些问题的解决方法,方便自己查看,也方便大家查阅。 欲速则不达,欲达则欲速! 一、SSH 1、基本概念 SSH框架是JAVA EE中三种框架所集成,分别是Struts,Spring,Hibernate框架所组成,是当前比较流行的java web开源框架。 集成SSH框架的系统从职责上分为(Struts2--...

学Java,找哪吒 6万+

Java EE | 浅谈SSH三大框架及整合流程

Struts2、Structs2 标签、Hibernate、Spring核心技术、SSH框架整合

ZY-JIMMY 3606

java ssh框架 struts spring hibernate 简介

目录 什么是SSH框架 浅谈Struts 什么是Struts Struts的核心构成 为什么使用Struts 浅谈Hibernate 什么是Hibernate Hibernate的核心构成 浅谈Spring 为什么使用Spring 什么是SSH框架 官方的说法:SSH是 struts+spring+hibernate的一个集成框架,是目前较流行的一种web应用程序开源框架。 SSH不是一个框架,而是把多个框架(Struts、Spring以及Hibernate)紧密的结合在一起.

whatday的专栏 1752

SSH框架简介

什么是SSH? SSH是JavaEE中三种框架(Struts+Spring+Hibernate)的集成框架,是目前比较流行的一种Java Web开源框架。 学习SSH方法 ? JavaEE学习就从最通用的MVC框架Struts开始学习,然后到Hibernate,最后是Spring。 对于Struts来说,Struts1和Struts2区别较大。还是把最原始的东西多看一下,对我们程序员来说可...

Lamitry的博客 3万+

Java企业级框架技术-Topic 1 SSH框架

什么是框架?为什么要使用框架?常用的技术框架有哪些? 框架概念 框架技术解决的问题 使用框架技术能够解决以下三方面的问题。 实现常见任务,如数据转换、日志等。软件架构方案。 对特定领域问题的可重用、易扩展的解决方案。 什么是框架     框架(即Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。框架是一个提供了可重用的公共结构的半成品,它

程序媛一枚 3016

什么是SSH?什么是SSM?SSH框架和SSM框架的区别

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考Struts、Spring和Hibernate ,简称SSH。在10多年前,SSH绝对是业内最流行的企业级开发框架。Struts和Hibernate目前来看,已经比较陈旧,而且也是比较重的框架,企业中目前已经很少用了。一些二三线小公司或者一线城市中的老旧项目,可能还在用这两种框架,新项目基本不会再采用这两个框架了。

sunzixiao的博客 997

SSM和SSH框架介绍

SSM和SSH是Java企业级开发中两种经典的三层架构框架组合。SSH由Struts2(表现层)、Spring(核心容器)和Hibernate(持久层)组成,适合早期小型项目但配置复杂、性能较低。SSM由SpringMVC(表现层)、Spring(核心容器)和MyBatis(持久层)组成,配置简单、性能优越,是目前主流框架。核心区别在于SSM采用SpringMVC和MyBatis,比SSH的Struts2和Hibernate更灵活高效。建议优先学习SSM框架,掌握后进一步学习Spring Boot和Spri

weixin_45784564的博客 926

java框架ssh实验报告_j2ee“ssh框架”实验报告.doc

j2ee“ssh框架”实验报告.doc 1软件学院综合性实验报告专业JAVA年级/班级2011计算机1班20122013学年第二学期课程名称JAVAEE程序设计指导教师姓名学号实验地点实验时间6月1、8、15日上午34节项目名称SSH框架集成应用实验类型综合性一、实验目的1SSH为STRUTSSPRINGHIBERNATE的一个集成框架,是目前较流行的一种WEB应用程序开源框架。因此希望通过本次实...

weixin_35316354的博客 417

SSH和SSM都是Java开发中的框架技术,而Spring则是Java开发中的一个核心框架

其中,Struts负责MVC的Controller层,Spring负责业务逻辑层(Service)以及数据访问层(DAO),Hibernate则负责持久层,也就是数据库操作。Spring:Spring是一个开源的Java EE应用程序框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC/ORM等众多的企业级应用模块,并支持与多种Web服务器、持久层框架、模板引擎等进行集成。其中,Spring负责整体架构的管理,包括依赖注入、事务管理等;

[Blog][Domain] programb.blog.youkuaiyun.com 839
上一篇: Java EE SSH框架之hibernate(2)—— hibernate详解
下一篇: Java EE SSH框架之hibernate(4)—— 查询优化
zl_StepByStep
博客等级 码龄10年 154粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值