当前位置: 首页 > 编程日记 > 正文

JPA多对多关联

关于JPA多对多关系,这是使用学生与教师来表示。一个Student由多个Teacher教,同样一个Teacher也可以教多个学生。Student类如下:

 1 package com.yichun.bean;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.Id;
11 import javax.persistence.JoinColumn;
12 import javax.persistence.JoinTable;
13 import javax.persistence.ManyToMany;
14 
15 //关系的维护端
16 @Entity
17 public class Student {
18     private Integer id;
19     private String name;
20     private Set<Teacher> teachers = new HashSet<Teacher>();
21 
22     public Student() {
23     }
24 
25     public Student(String name) {
26         this.name = name;
27     }
28 
29     @Id
30     @GeneratedValue
31     public Integer getId() {
32         return id;
33     }
34 
35     public void setId(Integer id) {
36         this.id = id;
37     }
38 
39     @Column(length = 10, nullable = false)
40     public String getName() {
41         return name;
42     }
43 
44     public void setName(String name) {
45         this.name = name;
46     }
47 
48     @ManyToMany(cascade = CascadeType.REFRESH)
49     // 关联表,inverseJoinColumns被维护端,
50     @JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id"))
51     public Set<Teacher> getTeachers() {
52         return teachers;
53     }
54 
55     public void setTeachers(Set<Teacher> teachers) {
56         this.teachers = teachers;
57     }
58 
59     // 添加teacher与student关系
60     public void addTeacher(Teacher teacher) {
61         this.teachers.add(teacher);
62     }
63 
64     // 删除teacher与student关联
65     public void removeTeacher(Teacher teacher) {
66         if (teachers.contains(teacher))
67             this.teachers.remove(teacher);
68     }
69 
70 }

Teacher类如下:

 1 package com.yichun.bean;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.Id;
11 import javax.persistence.ManyToMany;
12 
13 //关系被维护端,中间表的记录,不能由teacher删除,
14 @Entity
15 public class Teacher {
16     private Integer id;
17     private String name;
18     private Set<Student> students = new HashSet<Student>();
19 
20     public Teacher() {
21     }
22 
23     public Teacher(String name) {
24         this.name = name;
25     }
26 
27     @Id
28     @GeneratedValue
29     public Integer getId() {
30         return id;
31     }
32 
33     public void setId(Integer id) {
34         this.id = id;
35     }
36 
37     @Column(length = 10, nullable = false)
38     public String getName() {
39         return name;
40     }
41 
42     public void setName(String name) {
43         this.name = name;
44     }
45 
46     // 多对多基本不用级联删除
47     @ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers")
48     public Set<Student> getStudents() {
49         return students;
50     }
51 
52     public void setStudents(Set<Student> students) {
53         this.students = students;
54     }
55 
56     // id不为null返回id的hashCode,若没有id的时候,hashCode为0
57     @Override
58     public int hashCode() {
59         final int prime = 31;
60         int result = 1;
61         result = prime * result + ((id == null) ? 0 : id.hashCode());
62         return result;
63     }
64 
65     @Override
66     public boolean equals(Object obj) {
67         if (this == obj)
68             return true;
69         if (obj == null)
70             return false;
71         if (getClass() != obj.getClass())
72             return false;
73         Teacher other = (Teacher) obj;
74         if (id == null) {
75             if (other.id != null)
76                 return false;
77         } else if (!id.equals(other.id))
78             return false;
79         return true;
80     }
81 
82 }

这里Student是作为关系维护端,而Teacher是作为关系被维护端。所以当删除教师的时候,必须解除学生和教师的关联关系。代码如下:

 1     /**
 2      *<p>
 3      * 删除老师
 4      * </p>
 5      * 解除学生和老师的关系
 6      */
 7     @Test
 8     public void deleteTeacher() {
 9         EntityManagerFactory factory = Persistence
10                 .createEntityManagerFactory("yichun");
11         EntityManager manager = factory.createEntityManager();
12         manager.getTransaction().begin();
13 
14         // 解除关系
15         Student student = manager.find(Student.class, 1);
16         Teacher teacher = manager.getReference(Teacher.class, 1);
17         student.removeTeacher(teacher);
18 
19         // 删除教师
20         manager.remove(teacher);
21 
22         manager.getTransaction().commit();
23         manager.close();
24         factory.close();
25     }

而删除学生的时候,可以直接删除,jpa会自动解除学生与教师的关联关系,然后删除学生。

 1     /**
 2      *<p>
 3      * 删除学生
 4      * </p>
 5      * 直接可以删除,hibernate会自动解除学生和老师的关系,之后删除学生
 6      */
 7     @Test
 8     public void deleteStudent() {
 9         EntityManagerFactory factory = Persistence
10                 .createEntityManagerFactory("yichun");
11         EntityManager manager = factory.createEntityManager();
12         manager.getTransaction().begin();
13 
14         // 删除学生
15         Student student = manager.find(Student.class, 1);
16         manager.remove(student);
17 
18         manager.getTransaction().commit();
19         manager.close();
20         factory.close();
21     }

相关文章:

上市之后,青云存储平台 QingStor 也要“进军”云原生

作者 | 夕颜头图 | 下载于东方IC出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;3 月 16 日&#xff0c;北京青云科技股份有限公司&#xff08;以下简称“青云科技”&#xff09;登录科创板&#xff0c;昔日里频频出现在公众视野的云计算企业&#xff0c;终…

SQL Server 存储过程的分页方案比拼

建立表&#xff1a; CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI…

未来黑客入侵的不仅有电脑,还有人脑?

提到黑客入侵&#xff0c;我们能够知道的领域有很多&#xff0c;比如企业数据库、金融系统、个人信息、个人账户等。随着时代的变迁&#xff0c;人工智能、云计算、物联网等相继崛起&#xff0c;可能给黑客攻击的领域变得越发宽广。可是如果说黑客能攻击控制的不仅仅是电脑&…

不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令

我的BLOG里有一篇文章介绍了关于SQL注入的基本原理和一些方法。最让人感兴趣的也许就是前面介绍的利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令。这种方法也非常的简单&#xff0c;只需使用下面的SQL语句&#xff1a;EXEC master.dbo.xp_cmdshell dir c:/但是越来越…

谷歌低调了 5 年的 Fuchsia OS,终于有望面世了!

种种迹象表明&#xff0c;低调了多年的 Fuchsia OS 可能就要出首个开发者版本了&#xff01;整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;千呼万唤始出来&#xff0c;等待了五年&#xff0c;谷歌 Fuchsia OS 的首个开发者版本终于有望面世了&#…

chrom扩展开发-入门

2019独角兽企业重金招聘Python工程师标准>>> 先了解一下chrome的两种功能延伸方式&#xff1a; * 扩展&#xff08;Extension&#xff09; 1.指的是通过调用 Chrome 提供的 Chrome API 来扩展浏览器功能的一种组件&#xff0c;工作在浏览器层面&#xff0c;使用 HT…

你的机器学习模型为什么会出错?奉上四大原因解析及五条改进措施

对开发者来说&#xff0c;目前有一系列的机器学习模型可供选择。雷锋网(公众号&#xff1a;雷锋网)了解&#xff0c;可以用线性回归模型预测具体的数值&#xff0c;用逻辑回归模型对不同的运算结果进行归类&#xff0c;以及用神经网络模型处理非线性的问题等等。 不论哪一种&am…

释放CPU,算力经济下DPU芯片的发展机遇

当前承载算力的基础设施是各种规模的的数据中心&#xff0c;从几十个服务器节点的小规模企业级计算中心到数万个节点的巨型数据中心&#xff0c;通过云计算的模式对应用层客户提供存储、软件、计算平台等服务。这个生态直接承载了全球数十万亿美元规模的数字经济&#xff0c;而…

SQLserver安全设置攻略

日前SQL INJECTION的攻击测试愈演愈烈&#xff0c;很多大型的网站和论坛都相继被注入。这些网站一般使用的多为SQLSERVER数据库&#xff0c;正因为如此&#xff0c;很多人开始怀疑SQL SERVER的安全性。其实SQL SERVER2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的…

undefined symbol: ap_log_rerror;apache2.4与weblogic点so文件

没法子啊&#xff1b;只能用 httpd-2.2.26 https://www.google.com.hk/#newwindow1&qundefinedsymbol:ap_log_rerror&safestrictundefined symbol: ap_log_rerror[rootlocalhost local]# vi apache2/conf/httpd.conf[rootlocalhost local]# ./apache2/bin/apachectl s…

10个Java 8 Lambda表达式经典示例

Java 8 刚于几周前发布&#xff0c;日期是2014年3月18日&#xff0c;这次开创性的发布在Java社区引发了不少讨论&#xff0c;并让大家感到激动。特性之一便是随同发布的lambda表 达式&#xff0c;它将允许我们将行为传到函数里。在Java 8之前&#xff0c;如果想将行为传入函数&…

Sql server 2005带来的分页便利

select threadid from (select threadid, ROW_NUMBER() OVER (order by stickydate) as Pos from cs_threads) as T where T.Pos > 100000 and T.Pos < 100030 如果里面的这个表cs_threads数据量超大&#xff0c;比如&#xff0c;几亿条记录&#xff0c;那这个方法应该是…

想学Python?快看看这个教程!收藏!

Python入门从哪开始&#xff0c;90%以上的书上都是这样讲的&#xff1a;先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0c;介绍文件等IO操作.... 就这样一点一点往下说。然而这种按部就班的学习方法&#…

Struts1.x系列教程(4):标签库概述与安装

Struts的整个视图层&#xff08;就是MVC模式中的View层&#xff09;是由Struts的定制标签&#xff08;或者称为定制动作&#xff09;和客户端代码(Javascript、HTML等)实现的。这些Struts标签被写在JSP页面中&#xff0c;用于生成客户端代码、进行逻辑判断等工作&#xff0c;使…

绿盟科技与CCF成立“鲲鹏”科研基金 计划发力5大领域资助16个项目

【51CTO.com原创稿件】2017年5月10日&#xff0c;由中国计算机学会(CCF)和北京神州绿盟信息安全科技股份有限公司(以下简称&#xff1a;绿盟科技)主办的2017 CCF-绿盟科技“鲲鹏”科研基金新闻发布会于北京隆重举行。双方共同宣布“鲲鹏”科研基金正式成立&#xff0c;该基金将…

修改SQL SERVER内置存储过程

SQLSERVER估计是为了安装或者其它方面&#xff0c;它内置了一批危险的存储过程。能读到注册表信息&#xff0c;能写入注册表信息&#xff0c;能读磁盘共享信息等等……各位看到这儿&#xff0c;心里可能会在想&#xff0c;我的网站中有其它的代码&#xff0c;又不像查询分析器那…

〖Linux〗使用Qt5.2.0开发Android的NDK应用程序

2013年12月11日&#xff0c;Qt发布了其新的Qt版本&#xff1a;Qt5.2.0&#xff1b; 利用这个新的版本&#xff0c;我们可以很轻松地制作出Android手机的NDK应用程序。 开发环境&#xff1a;Ubuntu13.10 x86_64 下载链接&#xff1a;http://download.qt-project.org/official_re…

基于 OpenCV 的面部关键点检测实战

【 编者按】这篇文章概述了用于构建面部关键点检测模型的技术&#xff0c;这些技术是Udacity的AI Nanodegree程序的一部分。作者 | 小白责编 | 欧阳姝黎概述在Udacity的AIND的最终项目中&#xff0c;目标是创建一个面部关键点检测模型。然后将此模型集成到完整的流水线中&#…

气温上升影响数据中心节能

也许一些公司都是你熟悉的名字。但你可能不知道的是&#xff0c;这样的公司拥有遍布美国的大型数据中心&#xff0c;包括北弗吉尼亚州。数据中心用于存储、备份和通信业务&#xff0c;使用了大量的电力&#xff0c;为IT设备供电&#xff0c;并保持其冷却其数据中心基础设施。 也…

如何将SQL Server表驻留内存和检测

将SQL Server数据表驻留内存是SQL Server提供的一项功能&#xff0c;在一般小型系统的开发过程中估计很少会涉及到。这里整理了相关文档资料&#xff0c;演示如何把SQL Server中一个表的所有数据都放入内存中&#xff0c;实现内存数据库&#xff0c;提高实时性。 1, DBCC PINTA…

C 一样快,Ruby 般丝滑的 Crystal 发布 1.0 版本,你看好吗?

整理 | 寇雪芹 头图 | 下载于视觉中国 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 近日&#xff0c;编程语言 Crystal 发布了 1.0 版本。 Crystal 是一种通用的、面向对象的编程语言&#xff0c;其语法受到 Ruby 语言的启发&#xff0c;具有静态类型检查功能&am…

php in yii framework

为什么80%的码农都做不了架构师&#xff1f;>>> command line php yiic defined(STDIN) or define(STDIN, fopen(php://stdin, r));$_SERVER[argv](2013-12-30 22:44:10) 最近读这本书, 讲使用方法, 每章节各自独立, 配合些源码看(但不要细看, 会干扰进度, 浪费时…

selenium grid2 使用远程机器的浏览器

下载 selenium-server-standalone-3.4.0.jar包在selenium-server-standalone-3.4.0.jar包目录下面执行cmd 命令 java -jar selenium-server-standalone-3.4.0.jar -role hub 启用selenium grid hub&#xff0c; 默认端口 4444注册浏览器客户端&#xff0c;命令行执行&#xff…

Create a restful app with AngularJS/Grails(4)

为什么80%的码农都做不了架构师&#xff1f;>>> #Standalone AngularJS application In the real world applications, it is usually required to integrate the third party APIs into the project. Most of case, the third party service is provided as flexi…

无代码的时代真的来了吗?

所谓“无代码”&#xff0c;并不是不存在代码&#xff0c;无代码平台的开发&#xff0c;给开发者更大的挑战、更多 机会。所以&#xff0c;“无代码”不是解放程序员&#xff0c;而是给程序员提出了更高的要求、带来更大的挑战。作者 | 函子科技陆继恒&#xff0c;Jessica Tang…

实现自适应高度

天修改一个用Excel的报表,有一个数据格是跨两列,一般单格的数据格用自动换行就可以实现自适应高度,但是跨列是不行的.查找google良久,也没发现适合的办法,一阵头痛之后,突然有了灵感,于是马上做试验,还真的实现了.先写出来,如果有困于这个问题的朋友偶然路过,或许还能有一点用处…

分表分库之一:分布式数据库的常见用法

尽量减少事务边界 采用分库分表的方式将业务数据拆分后&#xff0c;如果每条SQL语句中都能带有分库分表键&#xff0c;分布式服务层对于SQL解析后都能精准地将这条SQL语句推送到该数据所在的数据库上执行&#xff0c;数据库将执行的结果再返回给分布式服务层&#xff0c;分布式…

打印自定义纸张大小

长江支流说的办法保留太多了,结果不行,很多类都是他在程序集里自定义的,源码又没公开 不过还是要感谢他的提示 今天和小陈搞了一天,他在国外的论坛上看到了一篇文章得到了启示,最后我们在凌晨3点终于把自定义纸张的代码给写出来了,看来必须用API,微软的.NET对打印的支持太菜了…

看完 50000 张专辑封面,AI 设计师开始疯狂输出

西班牙艺术家利用 StyleGAN2 打造了一个 AI 设计师&#xff0c;借助 50000 张图像自学成才&#xff0c;没想到培养一个印象派设计师这么简单。作者 | 三羊来源 | HyperAI超神经头图 | 网友整理抄袭事件的对比图也许是有些设计太经典出挑&#xff0c;总是让人情不自禁地模仿。日…

XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证

1. 申请许可证Citrix XenApp_XenDesktop7.6和XenServer 6.5申请许可证的步骤是一致的&#xff0c;由于之前我已经申请过XenApp_XenDesktop的许可证&#xff0c;本次以XenServer6.5的许可证申请为例。1.1 在申请试用或购买Citrix产品时&#xff0c;收到相应的邮件&#xff0c;其…