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

如何使用JPA注解标注多对多的关系

假设应用场景如下:Teacher与Student是多对多的关系,其中,Teacher类对应teacher表如下:

CREATE TABLE `teacher` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

Student类对应student表如下:

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL, 
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

中间表teacher_student表如下:

CREATE TABLE `teacher_student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `teacher_id` bigint(20) NOT NULL ,
  `student_id` bigint(20) NOT NULL ,
  PRIMARY KEY (`id`),
  KEY `fk_reference_50` (`teacher_id`),
  CONSTRAINT `fk_reference_50` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`),
  KEY `fk_reference_60` (`teacher_id`),
  CONSTRAINT `fk_reference_60` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

Student类如下:

public class Student{
     //对应的教师集合
    private Set<Teacher> teachers = new HashSet<Teacher>();

    /*   
     * @ManyToMany 注释表示Student是多对多关系的一边,mappedBy 属性定义了Student 为双向关系的维护端   
     */   
    @ManyToMany(mappedBy = "students")   
    public Set<Teacher> getTeachers() {   
        return teachers;   
    }   
  
    public void setTeachers(Set<Teacher> teachers) {   
        this.teachers = teachers;   
    }   
}

说明

1、该类经过简化,没有列出全部代码,在此我们只关注ManyToMany注解及其属性设置。

其他属性说明参加上篇文章:如何使用JPA注解标注一对一的关系

public class Teacher implements Serializable {   
   // 对应的学生集合
    private Set<Student> students = new HashSet<Student>();
  
    /*   
     * @ManyToMany 注释表示Teacher 是多对多关系的一端。   
     * @JoinTable 描述了多对多关系的数据表关系,name属性指定中间表名称。   
     * joinColumns 定义中间表与Teacher 表的外键关系,中间表teacher_student的teacher_id 列是 teacher 表的主键列对应的外键列。   
     * inverseJoinColumns 属性定义了中间表与另外一端(Student)的外键关系。   
     */   
    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)   
    @JoinTable(name = "teacher_student",
            joinColumns ={@JoinColumn(name = "teacher_id", referencedColumnName = "id") },     
            inverseJoinColumns = { @JoinColumn(name = "student_id", referencedColumnName = "id")     
    })   
    public Set<Student> getStudents() {   
        return students;   
    }   
  
    public void setStudents(Set<Student> students) {   
        this.students = students;   
    }   
}

说明:

1、@JoinTable
@JoinTable注解定义了联接表的表名,连接列数组,以及invers连接列数组。invers连接列数组是关联表中关联到student表主键的列(the “other side”)。

被关联端(Student)不必也不能描述物理映射:只需要一个简单的mappedBy参数,该参数包含了主体端(Teacher)的属性名,这样就绑定了双方的关系。

默认值:

和其它许多注解一样,在多对多关联中很多值是自动生成,当双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值:

关联表名:主表表名+下划线+从表表名;
关联到主表的外键名:主表名+下划线+主表中的主键列名;
关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名。

以上规则对于双向一对多关联同样一样。

转载于:https://www.cnblogs.com/shihao/archive/2012/06/21/2558333.html

相关文章:

艾伟也谈项目管理,敏捷教练的工具箱

学习并不是简简单单的阅读和浏览&#xff0c;而是一个积累的过程&#xff0c;一个通过持续的学习&#xff0c;对自己的知识体系不断丰富、索引的过程。接下来我会从四个方面入手分享我的经验。 高质量的信息源和高效的学习 Google是一个很好的工具&#xff0c;通过它&#xff…

7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)

查看Odoo产品分析系列—-目录 CMR&#xff1a;Customer Relationship Management。企业为提高核心竞争力&#xff0c;利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互&#xff0c;从而提升其管理方式&#xff0c;向客户提供创新式的个性化的客户交…

用栈实现形如a+bb+a@的中心对称字符的检验

用栈实现形如ab&ba的中心对称字符的检验 将&前字符依次入栈与前字符进行比较即可&#xff0c;下面是方法 Status match(char *a){ //match方法 SqStack s; char c; char *pa; InitStack(s); while(*p!&){ …

Typedef用法(转载)

在C的学习过程中&#xff0c;现在才发现&#xff0c;以前有那么多被忽略的重点&#xff1b;现在是慢慢拾起这些重点的时候&#xff0c;通过百度和博客&#xff0c;我感觉我学到了很多东西&#xff0c;自己只是在别人说的基础上&#xff0c;按照自己学习的过程在这里记录一下&am…

JavaScript基本知识

数组的排序 JavaScript可以实现多维数组,对象数组等排序,语法如下 arrayobj.sort(sortfunction) 参数 arrayObj 必选项。任意 Array 对象。 sortFunction 可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略&#xff0c;那么元素将按照 ASCII 字符顺序进行升序排列…

七基于Fourinone实现MQ demo

2019独角兽企业重金招聘Python工程师标准>>> FourInOne也可以当成简单的mq来使用&#xff0c;该demo演示了队列和主题订阅两种模式的实现 一、队列 将domain视为mq队列&#xff0c;每个node为一个队列消息&#xff0c;检查domain的变化来获取队列消息。 Sender&…

Windows下安装XAMPP,Wordpress

配置XAMPP&#xff1a; 1、下载&#xff1a;https://www.apachefriends.org/zh_cn/download.html&#xff08;下载速度日了狗&#xff01;&#xff09; 2、安装XAMPP; 3、启动apache&#xff0c;MySQL&#xff1a; Apache启动错误&#xff1a; …

原生js实现复制

最后我的解决方案是&#xff0c;在页面中添加一个 div&#xff0c;手动写入内容innerHTML&#xff0c;然后把它隐藏掉 function copy(targetDom) {let range document.createRange();range.selectNode(hiddenErrcode);window.getSelection().removeAllRanges();window.getSele…

C#条件判断-根据条件判断要走的路-if结构

什么时候要用到if结构语句呢?如果有一个班的学生期末成绩不是很理想&#xff0c;原因是考题太难&#xff0c;教师希望根据学生平时的表现给不同学生加平时成绩分&#xff0c;条件如下&#xff1a; 如果平时每次都交作业&#xff0c;加20分&#xff1b;如果平时交了超过所有作业…

既往出现中性粒细胞减少的患者可以重新应用依那西普

原文 译文 Clin Rheumatol. 2011 Aug 5. [Epub ahead of print] Re-challenge with Etanercept in patients with Etanercept-induced Neutropenia. Haroon M, Daly M, Harney S. Source Department of Rheumatology, Cork University Hospital, Cork, Irela…

RTTI(三)相关函数1【转自大富翁】

第三部分RTTI相关函数 GetTypeData 函数 GetPropInfo 函数 FindPropInfo 函数 GetPropInfos 函数 SortPropList 函数 GetPropList 函数 GetObjectPropClass 函数 PropType / PropIsType 函数 IsPublishedProp 函数 IsStoredProp 函数 FreeAndNilProperties 函数 SetToString /…

中序非递归遍历二叉树

二叉树的递归算法虽然简单&#xff0c;但是会导致时间复杂度比较高&#xff0c;下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树&#xff0c;和元素类型为二叉树的栈 typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild; }BiTNode,*BiTr…

修改属性使按钮处于无验证状态

.net 页面中如果有验证不为空的控件&#xff0c;而且有重置按钮。此时需要将重置按钮的属性设置为无验证状态 如图将CausesValidation属性设置为false转载于:https://www.cnblogs.com/xiaopanlyu/archive/2012/06/28/2568823.html

poj3253

本文地址&#xff1a;https://www.cnblogs.com/maplefighting/p/9116850.html 题目名称&#xff1a;Fence Repair 链接&#xff1a;http://poj.org/problem?id3253 题意&#xff1a;农夫准备把木板切成n块&#xff0c;每块长度为Li&#xff0c;每次切木板时需要花费切时木板的…

一起谈.NET技术,C#中int和System.Int32理解总结

最近园里的TeamOne写了一篇《[C#] int与System.Int32有什么区别》&#xff0c;发现里面有不少精彩的评论&#xff0c;所以忍不住想这篇文章总结一下: 本文的主要参考资料&#xff1a; 1.《理解C#中的System.Int32和int&#xff1a;并非鸡和鸡蛋》Author:Dixin 2.《[C#] int与Sy…

java多线程编程01---------基本概念

一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分&#xff0c;尤其是对于小白&#xff0c;次一系列文章的将会对多线程编程及其原理进行介绍&#xff0c;希望对正在多线程中碰壁的小伙伴有所帮助。 &#xff08;一&#xff09;进程、线…

Linux下查看Nginx,tomcat等的并发连接数和连接状态

1、查看Web服务器&#xff08;Nginx Apache&#xff09;的并发请求数及其TCP连接状态&#xff1a; netstat -n | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}或者&#xff1a; netstat -n | awk /^tcp/ {state[$NF]} END {for(key in state) print key,"t"…

Java笔记整理-02.Java基础语法

1&#xff0c;标识符 由英文字母、数字、_(下划线)和$组成&#xff0c;长度不限。其中英文字母包含大写字母&#xff08;A&#xff5e;Z&#xff09;和小写字母&#xff08;a&#xff5e;z&#xff09;&#xff0c;数字包含0到9。 标识符的第一个字符不能是数字&#xff08;即…

android中The connection to adb is down,问题和解决 AndroidEclipseAntXML

1.报错&#xff1a;BUILD FAILEDD:\workspace\ganji\build.xml:144: The following error occurred while executing this line:D:\workspace\ganji\build.xml:271: Unable to delete file D:\workspace\ganji\tmp\proguard\tmp.jar解决&#xff1a;已经开了一个模拟器了&#…

建立可扩展的silverlight应用框架 step-4

通过外部配置文件加载模块module 在上一节中为项目引入了“Prism”框架&#xff0c;并建立了一个Hello Prism做测试。这里要把项 目好好的整理一下。使其更加的合理和具有可扩展性。 我的目的是&#xff0c;在左侧的导航栏目里点击按钮&#xff0c;相应的右侧的主体部分显示不同…

ntp时间同步服务

前言 NTP 网络时间协议用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。而另一方面&#xff0c;一个 NTP 服务器会将它的时间和任意公共 NTP 服务器&#xff0c;或者你选定的服务器同步。由 NTP 管理的所有…

C# GDI+ 简单绘图 (三)

感谢大家的支持,这几天从早忙到晚,一个字累呀!!!现在挺困的,但是又不习惯这么早睡觉,哎~~还是利用这个时间继续来写第三篇吧.前两篇已经基本向大家介绍了绘图的基本知识.那么,我就用我们上两篇所学的,做几个例子&#xff0e;我们先来做一个简单的----仿QQ截图,关于这个的例子其…

用java实现一个简易自动提款机

用java实现一个简易自动提款机&#xff0c;且有以下要求 如何实现呢&#xff1f;首先&#xff0c;我们定义一个用户类User&#xff0c;同时根据要求设计好属性(本人部分命名没有使用驼峰命名法&#xff0c;不够规范)。因为一个人可能有多个卡&#xff0c;卡号又不能重复&#x…

mysql java jdbc 如何 update select

2019年8月6日17:28:07 sql 不知道怎么写&#xff0c;也没去查&#xff0c;因为需求可能中途需要修改值&#xff0c;有点麻烦 直接用jdbc实现。 查询出来的值&#xff0c;直接根据update条件更新&#xff0c;写在一个方法里 public static void GetWeiLiaoMsg(String day) {try …

2000DC和DNS迁移到2003 R2

2000DC和DNS迁移到2003 R2 实验环境&#xff1a;一台TPLINK路由器&#xff0c;三台电脑&#xff0c;以下简称A&#xff0c;B&#xff0c;C。A当作公司的2000DC和DNS服务器。B当作公司要升级的2003R2 DC。C 当作客户机&#xff0c;测试用。1&#xff0e; 对TPLINK路由器&…

SAP EWM 代码实现Transportation Unit(TU)的创建

在EWM中很少有创建或者修改业务对象的BAPI存在&#xff0c;更多的是通过很多面向对象的类方法来实现。 以下这个简单的创建TU应该能很好的体现SCM平台中的OO特性。 REPORT yewm_tu_creation NO STANDARD PAGE HEADING. TYPES: BEGIN OF lty_key_wrk, tu_num TY…

libcurl 客户端实例

参考库 libftp (though its in C)ftplib (again, looks like C)libCurl seems to have FTP capabilities.ace源码&#xff1a;main.c #include <stdio.h> #include <string.h>#include <curl/curl.h> #include <sys/types.h> #include <sys/stat.h&…

哈夫曼树的生成及哈夫曼编码

首先构造哈夫曼树结构体&#xff0c;初始化哈夫曼树的四个无符号整型域&#xff0c;输入文本&#xff0c;统计各个字符的权值&#xff0c;然后构建哈夫曼树&#xff0c;从根到叶子逆向求哈夫曼树的编码。 #include"stdio.h" #include"string.h" #include&…

shiro(2)-架构与配置

认证就是用户确认身份的过程&#xff0c;确认登录的用户身份能够操作的内容。 使用shiro认证分为以下几个步骤&#xff1a; 1&#xff0c;得到主体的认证和凭据。 // lets login the current user so we can check against roles and permissions:if (!currentUser.isAuthentic…

unity中的UI状态机,用于各界面之间的切换和跳转

首先感谢姜雪松先生&#xff0c;大家可以去他的博客查看注释以及代码等&#xff0c;http://jxwgame.blog.51cto.com/943299/1613585 言归正传&#xff1a; 1.在开发项目的过程中&#xff0c;总是会遇到这样的问题&#xff0c;从一个界面跳转到另外一个界面&#xff0c;每次操作…