关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

old:

  @ManyToMany 注释:表示此类是多对多关系的一边,

  mappedBy 属性定义了此类为双向关系的维护端

  注意:mappedBy 属性的值为此关系的另一端的属性名。

  例如,在Student类中有如下方法:

  被控方:

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "students")

    public Set<Teacher> getTeachers() {

      return teachers;

      }

那么这里的“students”就是Teachers的一个属性,通常应该是这样的:

Set<Student> students;

另一端的getStudents方法如下所示:

   主控方:

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)

    @JoinTable(

    name = "Teacher_Student",

    joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},

    inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")}

    )

    

    public Set<Student> getStudents() {

      return students;

    }

    @ManyToMany 注释表示Teacher 是多对多关系的一端。

    @JoinTable 描述了多对多关系的数据表关系。

    name 属性指定中间表名称,

    joinColumns 定义中间表与Teacher 表的外键关系。

    上面的代码中,

    中间表Teacher_Student的Teacher_ID 列是Teacher 表的主键列对应的外键列,

    inverseJoinColumns 属性定义了中间表与另外一端(Student)的外键关系。

  可以通过上面的定义看到有三个表学生表--老师表--老师学生中间表

  以上提到主控方和被控方。。本人不赞同这种写法:

  理由是: 1.既然是多对多关系。。为什么还要分主动方和被动方?

    2.为什么需要删除老师后才级联中间表。。。请注意:以上定义方法时,删除学生是无法级联删除中间表的。

    正确的写法应该是两边都用主控方的写法:

  只是joinColumns和inverseJoinColumns属性的地方互换就可以了

new:

  总结:

  

    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)

    @JoinTable(

    name = "Teacher_Student",

    joinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "studentid")},

inverseJoinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName ="teacherid")}

    )

    public Set<Teacher> getTeachers() {

      return teachers;

    }

    

    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)

    @JoinTable(

    name = "Teacher_Student",

    joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},

inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")}

    )

    public Set<Student> getStudents() {

      return students;

    }

摘自:关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

2017-08-15  10:24:43

时间: 2024-10-25 19:15:52

关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】的相关文章

关系对象映射

ORM(object relationalMapping) 对象是一个内存结构,与关系数据型数据库中的记录从逻辑上说存在映射关系,但是从存储关系上说面向对象与关系型数据库存在互不匹配现象,对象关系映射是为了解决这种不匹配现象的技术,它通过描述对象和数据库之间映射关系的元素,将java程序中的对象自动持久化到关系数据库中,反过来讲数据库中的记录自动的读取到内存结构对象中. 对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据..内存中的对象之间存在关联和继承

一:ORM关系对象映射(Object Relational Mapping,简称ORM)

狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB first 先在数据库中创建数据库表等 Code first 先创建类,然后根据类创建数据表等.django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 二:Django ORM创建 1)创建类 创建的类必须继承models.Model,在数据库中自动创建表名为:app

Python与数据库[2] -&gt; 关系对象映射/ORM -&gt; ORM 与 sqlalchemy 模块

ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对象关系映射.简单的说,ORM将数据库中的表与面向对象语言中的类建立了一种对应关系.这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成. 如果写程序用适配器(Adaptor)和程序交互,则需要要写原生SQL语句.如果进行复杂的查询,那SQL语句就要进行一点一点拼

Python与数据库[2] -&gt; 关系对象映射/ORM -&gt; 利用 sqlalchemy 实现关系表查询功能

利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例中用到的表主要有3张,一张personInfo个人信息表,一张account_store账号信息表,以及一张person_account_rel的个人信息与账号关系表. 示例中将会通过已知的人物年龄和id通过个人信息表查出个人姓名(仅为参考示例,请忽略怪异的查找逻辑 :) ),随后根据关系表得到的人

django关系对象映射(Object Relational Mapping,简称ORM)

Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models class userinfo(models.Model): name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField() 连表结构 一对多:models.ForeignKey(其他表)

Python与数据库[2] -&gt; 关系对象映射/ORM -&gt; sqlalchemy 的基本使用示例

sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: 1 from sqlalchemy import create_engine, exc, orm 2 from sqlalchemy.ext.declarative import declarative_base 3 from sqlalchemy.sql.schema import Table, Fo

ORM(关系对象映射)框架之面向对象

1. 提取共性 2. 分类 3. 模板"约束" 4. 当一类函数公用同样参数时候,可以转变成类进行 - 分类 3. 面向对象: 数据和逻辑(属性和行为)组合在一起    函数编程:数据和逻辑分离 1 特殊方法: 2 class Foo: 3 def __init__(self,name): 4 self.name = name 5 6 7 def show(self): 8 print(self.name) 9 10 def __call__(self): 11 pass 12 13

Hibernate自身一对多和多对多关系映射

一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别,新闻包含体育新闻和政治新闻,体育新闻内有含有足球新闻和篮球新闻,其实他们都属于新闻,只是名字不同而已,下面我们就以新闻类别为例来具体说明一下: 首先我们来看一下新闻类别的类图: 类图:category 从上面的图我们可以看出:每一个新闻类别都有一个父类别和一个孩子类别的set集合,这个父类别和孩子

关联映射 ---- Hibernate之多对多关系

叙:上一章详细的记录了关联映射中的"一对多|多对一"关系.级联操作.关系的维护等知识点,本章节轻风学习记录的是级联关系中的"多对多"关系: Hibernate的"多对多"级联关系 1. 介绍 在生活中很多关系都是多对多的,比如一个人在公司是技术部的同时也是营销部的(只是个例子),所以,多对对关系是很普遍的,一个对象有多个角色,而一个角色又可以有多个对象,因此最正确的做法是在对象与角色之间创建一个新的表,用来保存对象和角色的主键,方便调用查看相应的