与DAO模式的对称关系

时间:2018-12-22 21:11:38

标签: java jdbc dao

我正在尝试用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) {...}
}

到目前为止,还没有问题,但是如果学生拥有Teacher属性,我该如何编码StudentDAO的find?它会调用TeacherDAO的find,然后无限循环。

但这是必要,一个学生拥有教师财产,否则我如何insert一名新学生而无需指定相应的老师?

1 个答案:

答案 0 :(得分:1)

这也可以解决创建ORM时遇到的这种问题。

如果您需要学生与教师之间的双向关系,则确实应该执行一次获取关系。

我注意到,在您的示例中,您希望加载教师以及其关系。
在某些情况下这可能是理想的,但在其他情况下则是不希望的。因此,您可能应该将此功能参数化。我将在稍后详细介绍这一点。

在您的情况下,我可能会在findWithStudents(int teacherId)中定义TeacherDAO,以便将教师和代表加载到find(int studentId, Teacher teacher)中的StudentDAO中,以加载学生。
通过这种方式,在StudentDAO中,该方法知道教师已经加载,并且不会再次加载。
如果说得通,那么在某些其他情况下您可能会过载。 例如,findWithTeacher(int studentId)中的StudentDAO既加载了学生和老师,又find(int teacherId)中的TeacherDAO仅加载了老师。