假设应用场景如下: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

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

  1. JPA注解(这里包含sequence类型的)

    1.@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 @Entity //标识这个pojo是一个jpa实体     public c ...

  2. mybatis 一对多查询_Java自学之mybatis:使用注解方式多对一查询

    学习目的:学习使用注解方式实现多对一查询,查询出所有的Product,通过product_中的cid查询到所属的Category. Part 1 mapper CategoryMapper packa ...

  3. Servlet3.0学习总结(四)——使用注解标注监听器(Listener)

    Servlet3.0提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了. 下面我 ...

  4. SpringMVC中使用@ResponseBody注解标注业务方法

    SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些spring的包之外,还需要jackson-annotations.jar ...

  5. JPA注解-@SequenceGenerator

    原 JPA注解-@SequenceGenerator 发表于3年前(2012-11-13 18:41)   阅读(3446) | 评论(0) 3人收藏此文章, 我要收藏 赞0 大约十一点零八发,秒杀云 ...

  6. springboot中mybatisplus基于注解的多对多级联查询

    mybatisplus使用注解多对多级联查询 mybatis提供了注解和xml两种方式配置我们的sql语句,我在接触使用的过程中更喜欢注解的方式,在我的上一个项目中,我全部使用mybatis注解去完成 ...

  7. hibernate注解方式来处理映射关系

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...

  8. hibernate annotation注解方式来处理映射关系

    2019独角兽企业重金招聘Python工程师标准>>> 在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟 ...

  9. 一对多和多对一的关系,用mybatis写

    用国家(country)和用教堂(minxter)来做例子. 例如country对于minxter来说是一对多的关系, 那么在mapper映射文件中 相反过来,minxter对于country是多对一 ...

最新文章

  1. ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤
  2. RequireJS和AMD规范
  3. netbean创建jsf项目
  4. 7、Python文件操作工具 openpyxl 工具 2
  5. Lambda运行时内部:窥视无服务器巢穴
  6. 机场精细化管理_宇视科技智慧机坪解决方案助力机场实现精细化管理
  7. [深度学习-优化]dropout防止过拟合的理解
  8. 10-10-归并排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
  9. 马哥【直播班】Python运维自动化与DevOps项目特训班学习记录
  10. 基于UDS协议的Bootloader
  11. Ubuntu使用systemd设置开机自启动
  12. 版式设计怎么做对比?有哪些形式!
  13. 波兰计算机留学,波兰(Rzeczpospolita Polska)留学申请全面解析
  14. Android 中Goolgle 相关服务的移植
  15. 数组中的键值对去重_数组去重-
  16. Android中DialogFragment自动弹出输入法
  17. 用Python 画螺旋正方形
  18. matplotlib 关于使用 MultipleLocator 自定义刻度间隔
  19. 关于SQL练习2的一些写法。。。
  20. 如何使用COleDateTime类获取昨天(前几天)的日期

热门文章

  1. 2021-2027年中国医疗旅游业投资分析及前景预测报告
  2. 使用 alpine 打包镜像注意事项
  3. debian10 ftp简单搭建
  4. 【C#实践】详解三层转七层:登录
  5. 深度学习的分布式训练--数据并行和模型并行
  6. Python 标准库之 xml.etree.ElementTree xml解析
  7. 初学MyBatis-Plus
  8. LeetCode简单题之词典中最长的单词
  9. Minkowski修剪
  10. 深度学习-智能视频监控