簡體   English   中英

使用JOIN-Table休眠多對多關聯

[英]Hibernate Many-To-Many Association using JOIN-Table

我發現很難理解使用join table進行休眠的多對多關聯。

我從網上得到了樣本項目。 這包括

Course.java

package com.chad.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="chad_course")
public class Course {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="title")
    private String title;

    @ManyToMany(fetch=FetchType.LAZY,cascade={CascadeType.REFRESH,CascadeType.MERGE,CascadeType.PERSIST})
    @JoinTable(name="course_student",
               joinColumns=@JoinColumn(name="course_id"),
               inverseJoinColumns=@JoinColumn(name="student_id"))
    private List<Student> studentList;

    public Course()
    {

    }

    public Course( String title) {
        this.title = title; 
    }




    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public String getTitle() {
        return title;
    }


    public void setTitle(String title) {
        this.title = title;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }


}

學生.java

package com.chad.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="Chad_student")
public class Student {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="FIRST_NAME")
    private String firstName;

    @Column(name="LAST_NAME")
    private String lastName;

    @Column(name="EMAIL_ID")
    private String email;

    @ManyToMany(fetch=FetchType.LAZY,cascade={CascadeType.REFRESH,CascadeType.MERGE,CascadeType.PERSIST})
    @JoinTable(name="course_student",
                joinColumns=@JoinColumn(name="student_id"),
                inverseJoinColumns=@JoinColumn(name="course_id"))
    private List<Course> courseList;

    public Student(){}

    public Student(String firstName, String lastName, String email) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


}

1)我的疑問是,我從互聯網獲得的例子有

@ManyToMany(fetch=FetchType.LAZY,cascade={CascadeType.REFRESH,CascadeType.MERGE,CascadeType.PERSIST})
        @JoinTable(name="course_student",
                    joinColumns=@JoinColumn(name="student_id"),
                    inverseJoinColumns=@JoinColumn(name="course_id"))

上面的塊用兩個實體類編寫。 但是在其他一些文章中,他們在一個實體類中編寫了相同的塊。
在另一個實體類中,只有@ManyToMany->沒有joinColumn

我能知道這兩種語法的重要性嗎?

2)運行該程序后,我得到以下日志

Main.java

Course course = new Course("Photography");

        session.save(course);

        Student student1 = new Student("John", "Dao", "john@gmail.com");
        Student student2 = new Student("John1", "Dao1", "john1@gmail1.com");


        List<Student> studentList = new ArrayList<Student>();
        studentList.add(student1);
        studentList.add(student2);

        course.setStudentList(studentList);

        session.save(student1);
        session.save(student2);

        session.getTransaction().commit();

日志

Hibernate: insert into chad_course (title, instructor_id) values (?, ?)
Hibernate: insert into Chad_student (FIRST_NAME, LAST_NAME, EMAIL_ID) values (?, ?, ?)
Hibernate: insert into Chad_student (FIRST_NAME, LAST_NAME, EMAIL_ID) values (?, ?, ?)
Hibernate: insert into course_student (course_id, student_id) values (?, ?)
Hibernate: insert into course_student (course_id, student_id) values (?, ?)

現在

  • 第一個插入到chad_course中。 正確

  • 第二和第三插入插入Chad_student中。 正確

  • 由於沒有選擇查詢發生,因此第4和第5個插入是插入到course_student中->休眠狀態如何知道將要插入的course_id和student_id。

GenerationType.IDENTITY用於支持自動增量的數據庫(如MySQL,SQLServer和其他少數數據庫),但並非在所有數據庫(如Oracle等)中都可用。

這就是您看不到任何選擇SQL查詢被觸發的原因

檢查-Hibernate中的GenerationType.AUTO與GenerationType.IDENTITY

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM