繁体   English   中英

JPA:OneToMany关系使Collection为空

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM