java - 与 DAO 模式的对称关系

标签 java jdbc dao

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

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

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

但是学生有教师属性是必要的,否则我如何在不指定相应教师的情况下插入新学生?

最佳答案

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

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

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

在你的情况下,我可能会定义 findWithStudents(int teacherId)TeacherDAO将教师和代表加载到 find(int studentId, Teacher teacher)StudentDAO加载学生。
这样在StudentDAO ,该方法知道教师已经加载,并且不会再次加载。
如果正如所说的那样,您可能会在其他情况下出现过载。 例如findWithTeacher(int studentId)StudentDAO加载学生和老师或 find(int teacherId)TeacherDAO只加载老师。

关于java - 与 DAO 模式的对称关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899326/

相关文章:

java - JDBC:查询结果并将批处理添加到另一个表中

java - Python 相当于 Java 的 statement.getGeneratedKeys()?

java - 通用 DAO 为什么使用通用类型 Id

java - 使用 JDBC PreparedStatement 在 MySql 中返回生成的键

Java:如何使用日期/日历

java - org.apache.commons.codec.DecoderException : Odd number of characters

java - 用户输入内容后,JSP页面不会移动到另一个页面

java - 缓存 javax.sql.Datasource 对象的单个实例是个好主意吗?

java - 这是 Selenium 文档中的错误吗?

java - 如果从类扩展线程类创建多个线程,方法是否需要同步?