如何实现多对多POJO结构?

我有很多学生,每个学生可能有很多科目,每个科目也可能有很多学生。现在,我想实现一个POJO结构:allStudentListallSubjectList仅用于查询每种类型的所有元素。
  这个结构设计合理吗?
  有更好的选择吗?
  这是我的方法:

//THE Student class 
public class Student {

    //List with all students.
    private static ArrayList<Student> allStudentList = new ArrayList<>();
    //Student fields
    private String id;
    private String name;
    //The subjects of Student
    private ArrayList<Subject> subjectsList = new ArrayList<>();

    public Student(String id,String subject) {
        this.id = id;
        this.name = subject;
        allStudentList.add(this);
    }

    public boolean addSubject(Subject subject) {
        subject.getStudentList().add(this);
        return subjectsList.add(subject);
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    ArrayList<Subject> getSubjectsList() {
        return subjectsList;
    }

    public void setSubjectsList(ArrayList<Subject> subjectsList) {
        this.subjectsList = subjectsList;
    }

    public static Student[] getStudents() {
        return allStudentList.toArray(new Student[allStudentList.size()]);
    }

    @Override
    public String toString() {
        String s = "";
        for (Subject subject : subjectsList) {
            s += "\n  " + subject.getId() +" " +subject.getName();
        }
        return "Student{" + "id=" + id + ",name=" + name + ",subjectsList=" + s + '}';
    }
//THE Subject class 
public class Subject {

    //List with all students.
    private static ArrayList<Subject> allSubjectList = new ArrayList<>();
    private String id;
    private String name;
    private ArrayList<Student> studentList = new ArrayList<>();


    public Subject(String id,String name) {
        this.id = id;
        this.name = name;
        allSubjectList.add(this);

    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    ArrayList<Student> getStudentList() {
        return studentList;
    }
    public boolean addStudent(Student student) {
        student.getSubjectsList().add(this);
        return studentList.add(student);
    }

    public static Subject[] getStudents() {
        return  allSubjectList.toArray(new Subject [allSubjectList.size()]);
    }

    @Override
    public String toString() {
        String s ="";
        for (Student student : studentList) {
           s +="\n  "+student.getId() +" "+student.getName();
        }
        return "Subject{" + "id=" + id + ",nombre=" + name + ",studentList=" +s  + '}';
    }
//The test class:
public class TestMany2Many {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Student student0 = new Student("ST000","Morty");
        Student student1 = new Student("ST001","Rick");
        Subject subject0 = new Subject("SU000","Physics");
        Subject subject1 = new Subject("SU001","Math");
        student0.addSubject(subject0);
        student0.addSubject(subject1);
        student1.addSubject(subject0);
        Student[] st = Student.getStudents();
        Subject[] su = Subject.getStudents();
        for (Subject subject : su) {
            System.out.println("subject = " + subject);
        }
        for (Student student : st) {
            System.out.println("student = " + student);
        }


    }

}
sibo3615 回答:如何实现多对多POJO结构?

您的学生班级似乎也包含所有学生的列表。但是您要实例化它多次,这将创建多个列表。将其视为列表可能会有所帮助,并在名称“ Students”的末尾添加“ s”。然后实例化一次并将学生添加到其中。

Subjects subjectList = new Subjects();
Students studentList = new Students();
subjectList.setStudents(studentList);

studentList.addStudent(student1ID,student1Name);
studentList.addStudent(student2ID,student2Name);
studentList.getStudent(studentID).addSubject(subjectID);

或者,对于最后一行

studentList.addSubject(student1ID,subjectID);

subjectID必须存在于等效的Subjects类中。

要跟踪多对多关系,如果可以的话,最好将数据保存在一个地方。否则,您实际上将拥有同一列表的两个副本。因此,与其将学生列表保留在subject对象内,不如可以通过students对象查询students对象以获得任何特定学科的学生列表。

public List<Student> getEnrolledStudents(String subjectID)
{
    Students studentList = getStudentList();
    return studentList.getStudentsEnrolledInSubject(subjectID);
}

搜索双向列表作为可能的解决方案。

students对象将能够直接找到任何学生正在修读的科目。

如果必须将数据同时放入两者中,则需要确保以某种方式同步数据,以便删除学生将删除学科中的相关记录,反之亦然。这很快就会变得混乱,很可能是练习的重点。

祝你好运!

本文链接:https://www.f2er.com/3086508.html

大家都在问