關系/對象映射 多對多關系(@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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM