Исключение assertTrue в весенней загрузке приложения oneToMany - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть приложение весенней загрузки с моделями cooperator и student (среди прочих).у них есть отношения @oneToMany со стороны сотрудника и @ManyToOne со стороны студента

класс сотрудника:

@Entity
public class Cooperator{
    private Integer id;

    public void setId(Integer value) {
        this.id = value;
    }
    @Id
    public Integer getId() {
        return this.id;
    }
    private Set<Student> student;

    @OneToMany(mappedBy="cooperator", cascade={CascadeType.ALL})
    public Set<Student> getStudent() {
       return this.student;
    }

    public void setStudent(Set<Student> students) {
       this.student = students;
    }

    public void addStudent(Student student) {
        try {
            this.student.add(student);
        }
        catch(Exception e) {    
            this.student = new HashSet<Student>();
            this.student.add(student);
        }
    }
}

класс ученика:

@Entity
public class Student{
    private String studentID;

    public void setStudentID(String value) {
       this.studentID = value;
    }
    @Id
    public String getStudentID() {
        return this.studentID;
    }

    private Cooperator cooperator;

    @ManyToOne(optional=false)
    public Cooperator getCooperator() {
       return this.cooperator;
    }

    public void setCooperator(Cooperator cooperator) {
       this.cooperator = cooperator;
    }
}

Я проверяю отношенияследующим образом:

    @Test
    public void cooperatorStudent() {
        String studentID = "260632353";
        String firstname = "Saleh";
        String lastname = "Bakhit";
        Student student1 = service.createStudent(studentID, firstname, lastname, cooperator);
        assertEquals(cooperator, student1.getCooperator());

        studentID = "260632350";
        firstname = "testFirst";
        lastname = "testLast";
        Student student2 = service.createStudent(studentID, firstname, lastname, cooperator);
        assertEquals(cooperator, student2.getCooperator());

        Set<Student> cooperatorStudents = cooperator.getStudent();
        assertTrue(cooperatorStudents.contains(student1));
        assertTrue(cooperatorStudents.contains(student2));

    }

Проблема в том, что операторы assertTrue не выполняются, хотя cooperatorStudents на самом деле содержит оба student объекта.

Любая помощь в том, почему это оченьочень ценится.

EDIT

Я добавляю student к cooperator Set<Student> student в createStudent, вот код для этого:

    @Transactional
    public Student createStudent(String studentID, String firstname, String lastname, Cooperator c) {
        if(!checkArg(studentID) || !checkArg(firstname) || !checkArg(lastname) || !checkArg(c)) {
            throw new NullArgumentException();
        }

        Student student = new Student();

        student.setStudentID(studentID);
        student.setFirstName(firstname);
        student.setLastName(lastname);
        student.setIsProblematic(false);

        student.setCooperator(c);
        c.addStudent(student);

        return studentRepository.save(student);
    }

Также добавление хеш-кода @override и равных ему дает стекопотока при создании второго ученика

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Насколько я ничего не пропустил, вы не добавляете объекты ученика в кооператор в методе test.

Вызов метода addStudent() в вашем методе test должен решить проблему.

@Test
public void cooperatorStudent() {
    String studentID = "260632353";
    String firstname = "Saleh";
    String lastname = "Bakhit";
    Student student1 = service.createStudent(studentID, firstname, lastname, cooperator);
    assertEquals(cooperator, student1.getCooperator());

    studentID = "260632350";
    firstname = "testFirst";
    lastname = "testLast";
    Student student2 = service.createStudent(studentID, firstname, lastname, cooperator);
    assertEquals(cooperator, student2.getCooperator());

    cooperator.addStudent(student1);
    cooperator.addStudent(student2);

    Set<Student> cooperatorStudents = cooperator.getStudent();
    assertTrue(cooperatorStudents.contains(student1));
    assertTrue(cooperatorStudents.contains(student2));
}
0 голосов
/ 27 февраля 2019

Затем вы хотите сравнить объекты, которые вы должны переопределить методами "equals" и "hashcode".По умолчанию каждый экземпляр класса «объект» будет уникальным, несмотря на то, что их поля одинаковы.Хорошее объяснение: https://dzone.com/articles/working-with-hashcode-and-equals-in-java

...