[英]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.