Симметричная связь с шаблоном DAO - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь реализовать шаблон DAO в Java, но я изо всех сил пытаюсь создать симметричное отношение, например, если у меня есть Учитель, у которого есть Студенты, я создам Список в Учителе, НО, если я создаю Учителясвойство в Student?

Классы DAO выглядят так:

public class TeacherDAO extends DAO<Teacher> {
    public Teacher find(int id) {
        Statement statement = Connection.getInstance();
        // Get the teacher and the students
        ResultSet rs = statement.executeQuery("SELECT * FROM teachers LEFT JOIN "
                                                + "students ON students.teacher_id = teacher.id")
        DAO<Student> studentDAO = new StudentDAO();

        Teacher teacher = new Teacher();
        teacher.setId(rs.getInt("id"));
        teacher.setName(rs.getString("name"));

        List<Value> students = new ArrayList<>();
        rs.beforeFirst();
        // For each student, add it to the list (after hydratation)
        while (rs.next() && rs.getInt("student.teacher_id") == teacher.getId()) {
            students.add(studentDAO.find(rs.getInt("student.id")));
        }
        teacher.setstudents(students);

        return teacher;
    }

    public boolean update(Teacher t) {...}
    public boolean insert(Teacher t) {...}
    public boolean delete(Teacher t) {...}
}

Пока нет проблем, НО, как, черт возьми, я могу кодировать find StudentDAO, если у ученика естьСобственность учителя?Это вызвало бы find TeacherDAO и затем бесконечно зациклилось бы.

Но необходимо , чтобы ученик имел свойство Учитель, иначе как я insert новый ученик, не указывая соответствующийУчитель

1 Ответ

0 голосов
/ 23 декабря 2018

Это также для решения проблем такого рода, которые были созданы ORM .

Если вам нужны двунаправленные отношения между учеником и учителем, вы действительно должны выполнить выборку отношений один раз.

Я отмечаю, что в вашем примере вы хотите загрузить Учителя, но также и его отношения.
Это может быть желательно в некоторых случаях, но нежелательно в других случаях.Таким образом, вы должны, вероятно, параметризовать эту функцию.Я подробно опишу этот момент в ближайшее время.

В вашем случае я бы, вероятно, определил findWithStudents(int teacherId) в TeacherDAO, который загружает учителей и делегатов в find(int studentId, Teacher teacher) в StudentDAO для загрузки ученика.
Таким образом, в StudentDAO,метод знает, что учитель уже загружен, и он не будет загружать его снова.
Если это имеет смысл, как сказано, у вас может быть перегрузка для некоторых других случаев.Например, findWithTeacher(int studentId) в StudentDAO, загружающем ученика и учителя, или find(int teacherId) в TeacherDAO, загружающем только учителя.

...