与 DAO 模式的对称关系

Symmetric relation with DAO pattern

我正在尝试在 Java 中实现 DAO 模式,但我正在努力创建一个对称关系,例如,如果我有一个有学生的教师,我将在教师中创建一个列表但是我应该在学生中创建一个教师 属性 吗?

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) {...}
}

到目前为止没问题,但是如果一个学生有一个老师 属性,我怎么能编写 StudentDAO 的 find 代码呢?它会调用TeacherDAO的find然后无限循环

但是需要一个Student有一个Teacher属性否则我如何insert一个新Student而不指定相应的Teacher?

那也是为了解决ORM这种问题而产生的。

如果你需要学生和老师之间的双向关系,你确实应该执行一次关系获取。

我注意到在您的示例中,您想要加载 Teacher 及其关系。
这在某些情况下可能是可取的,但在其他情况下是不可取的。所以你应该参数化这个功能。我将很快详细说明这一点。

在你的情况下,我可能会在 TeacherDAO 中定义 findWithStudents(int teacherId),将教师和代表加载到 StudentDAO 中的 find(int studentId, Teacher teacher) 以加载学生。
这样在StudentDAO中,方法就知道老师已经加载过了,不会再加载了。
如果如前所述有意义,您可能会在其他一些情况下超载。 例如 StudentDAO 中的 findWithTeacher(int studentId) 同时加载学生和教师,或者 find(int teacherId) in TeacherDAO 仅加载教师。