与 DAO 模式的对称关系
Symmetric relation with DAO pattern
我正在尝试在 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
然后无限循环
但是需要一个Student有一个Teacher属性否则我如何insert
一个新Student而不指定相应的Teacher?
那也是为了解决ORM这种问题而产生的。
如果你需要学生和老师之间的双向关系,你确实应该执行一次关系获取。
我注意到在您的示例中,您想要加载 Teacher 及其关系。
这在某些情况下可能是可取的,但在其他情况下是不可取的。所以你应该参数化这个功能。我将很快详细说明这一点。
在你的情况下,我可能会在 TeacherDAO
中定义 findWithStudents(int teacherId)
,将教师和代表加载到 StudentDAO
中的 find(int studentId, Teacher teacher)
以加载学生。
这样在StudentDAO
中,方法就知道老师已经加载过了,不会再加载了。
如果如前所述有意义,您可能会在其他一些情况下超载。
例如 StudentDAO
中的 findWithTeacher(int studentId)
同时加载学生和教师,或者 find(int teacherId)
in TeacherDAO
仅加载教师。
我正在尝试在 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
然后无限循环
但是需要一个Student有一个Teacher属性否则我如何insert
一个新Student而不指定相应的Teacher?
那也是为了解决ORM这种问题而产生的。
如果你需要学生和老师之间的双向关系,你确实应该执行一次关系获取。
我注意到在您的示例中,您想要加载 Teacher 及其关系。
这在某些情况下可能是可取的,但在其他情况下是不可取的。所以你应该参数化这个功能。我将很快详细说明这一点。
在你的情况下,我可能会在 TeacherDAO
中定义 findWithStudents(int teacherId)
,将教师和代表加载到 StudentDAO
中的 find(int studentId, Teacher teacher)
以加载学生。
这样在StudentDAO
中,方法就知道老师已经加载过了,不会再加载了。
如果如前所述有意义,您可能会在其他一些情况下超载。
例如 StudentDAO
中的 findWithTeacher(int studentId)
同时加载学生和教师,或者 find(int teacherId)
in TeacherDAO
仅加载教师。