[英]JPA: OneToMany relationship keeps the Collection empty
似乎我在理解JPA以及OneToMany關系如何實際工作方面遇到了困難。
例如,假設我有一個對象Class
@Entity
public class Class {
@Id
private String className;
@OneToMany(cascade = Cascade.ALL, orphanRemoval = true)
private Set<Student> students;
// Constructors, Getters, Setter
}
我還有一個對象Student
,該類位於Class中。
@Entity
public class Student {
@Id
private String studentName;
@ManyToOne
private Class class;
// Constructors, Getters, Setter
}
顯然,一個學生可以有多個班級,但不要管它了。
為什么當我建立一個班級然后使用該班級建立幾個學生時, ClassRepository
上的findAll()
返回一個空的學生集。
Class class = new Class("CS", new HashSet<>());
classRepository.save(class); // repository has no special functions
Student student1 = new Student("1", class);
Student student2 = new Student("2", class);
studentRepository.save(student1);
studentRepository.save(student2);
classRepository.findAll() // Returns me a List<Class> with only one class object that has an empty set.
我以為上面的代碼應該自動看到兩個學生來自一個班級,因此當我調用buildingRepository.findAll()
,它將返回一個Class
對象,並正確填充了學生集。
那我的理解錯了嗎? 還是我的代碼錯了? 以及如何更改它以進行修復?
你可以選擇:
1.單向@OneToMany
:
@Entity
public class Class {
@Id
private String className;
@OneToMany(cascade = Cascade.ALL, orphanRemoval = true)
private List<Student> students=new ArrayList<>();
// Constructors, Getters, Setter
}
@Entity
public class Student {
@Id
private String studentName;
// Constructors, Getters, Setter
}
現在,如果我們堅持一個Class
:
Class class1=new Class("name1");
class1.getStudents().add(new Student("student1Name"));
// then you can make a save of class1 in db
classRepository.save(class);
2.單向@OneToMany
與@JoinColumn
:
要解決上述額外的@JoinColumn
表問題,我們只需要在組合中添加@JoinColumn
:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "class_id")
private List<Student> students = new ArrayList<>();
3.雙向@OneToMany
:
映射@OneToMany關聯關系的最佳方法是依靠@ManyToOne端傳播所有實體狀態更改:
@Entity
public class Class {
@Id
private String className;
@OneToMany(
mappedBy = "class",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Student> students=new ArrayList<>();
// Constructors, Getters, Setter
public void addStudent(Student student) {
students.add(student);
student.setClass(this);
}
public void removeStudent(Student student) {
students.remove(student);
student.setClass(null);
}
}
@Entity
public class Student {
@Id
private String studentName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "class_id")
private Class class;
}
並堅持:
Class c1=new Class("className1");
c1.addStudent(new Student("StudentNAme1"));
c1.addStudent(new Student("StudentNAme2"));
c1.addStudent(new Student("StudentNAme3"));
classRepository.save(c1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.