【问题标题】:Symmetric relation with DAO pattern与 DAO 模式的对称关系
【发布时间】:2019-05-22 18:49:30
【问题描述】:

我正在尝试在 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,然后无限循环。

但是必须学生有一个教师属性,否则我怎么能insert一个新学生而不指定相应的教师?

【问题讨论】:

    标签: java jdbc dao


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2011-02-05
      • 2013-10-27
      • 2012-07-26
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多