zoukankan      html  css  js  c++  java
  • 关系/对象映射 多对多关系(@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;
        }
     
     
    2017-08-15  10:24:43
    请留下你的足迹...
  • 相关阅读:
    PHP扫描图片转点阵 二维码转点阵
    PHP设计模式之观察者模式
    Vue router 使用 History 模式导致页面请求 404
    MySQL(Oracle)模糊查询 使用 instr () 替代 like 提升效率
    jmeter压测小白常见问题解决
    mac上批量启动appium,并把appium日志打印到指定文件夹
    批量启动appium-server+java
    启动appium常用参数解析
    TestNg执行时报org.testng.TestNGException: org.xml.sax.SAXParseException异常解决
    解决启动appium 提示端口被占用问题
  • 原文地址:https://www.cnblogs.com/angelye/p/7363197.html
Copyright © 2011-2022 走看看