gpt4 book ai didi

java - 使用 JOIN-Table 的 Hibernate 多对多关联

转载 作者:行者123 更新时间:2023-11-30 21:39:02 25 4
gpt4 key购买 nike

我发现很难理解使用连接表的 hibernate 多对多关联。

我从 net 获得了示例项目。它包括

类(class).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;
}


}

Student.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) My doubt was , The example that i got from internet has

@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"))

上面的 block 写在两个实体类中。但是在他们写的其他一些文章中一个实体类中的相同 block 。
并且在另一个实体类中只有 @ManyToMany --> 没有 joinColumn

我能知道这两种语法的重要性吗??

2) After running the program i got the following logs

主.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 --> hibernate 怎么知道要插入什么 course_id 和 student_id ,因为没有选择查询发生。

最佳答案

GenerationType.IDENTITY 用于支持自动增量的数据库,如 MySQL、SQLServer 和其他一些数据库,这不适用于所有数据库,如 Oracle 等。

这就是您没有看到任何 Select SQL 查询被触发的原因

检查 - GenerationType.AUTO vs GenerationType.IDENTITY in hibernate

关于java - 使用 JOIN-Table 的 Hibernate 多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52591459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com