与DAO模式的对称关系

问题描述 投票:1回答:1

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

到目前为止没问题,但如果学生有教师财产,我怎么能编码学生DADA的find?它会调用TeacherDAO的find然后无限循环。

但是学生必须拥有教师财产,否则如何在没有指定相应教师的情况下insert新学生?

java jdbc dao
1个回答
1
投票

这也是为了处理ORM创建的这种问题。

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

我注意到在您的示例中,您希望加载教师以及它的关系。 在某些情况下这可能是合乎需要的,但在其他情所以你应该参数化这个功能。我很快就会详细说明这一点。

在你的情况下,我可能会在findWithStudents(int teacherId)中定义TeacherDAO,它将教师和代表加载到find(int studentId, Teacher teacher)StudentDAO来加载学生。 以这种方式在StudentDAO中,该方法知道教师已经加载并且它不会再次加载它。 如果它有意义,因为你可能有其他一些情况下的超载。例如findWithTeacher(int studentId)中的StudentDAO加载学生和老师或加载find(int teacherId)TeacherDAO只加载老师。

© www.soinside.com 2019 - 2024. All rights reserved.