与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模式的对称关系的主要内容,如果未能解决你的问题,请参考以下文章