簡體   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