与DAO模式的对称关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与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) {...}
}

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

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

答案

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

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

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

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

以上是关于与DAO模式的对称关系的主要内容,如果未能解决你的问题,请参考以下文章

Service-Dao 模式、DTO 和关系数据库

DAO模式

DAO模式

Hibernate GenericDAO 用于父/子关系和 DAO/DTO 模式

Java中使用DAO模式的多对多关系

如何使递归多对多关系与 Django 对称