我正在尝试用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) {...}
}
到目前为止没有问题,但是如果学生拥有Teacher属性,我该如何编码StudentDAO的
find
?它将调用TeacherDAO的find
,然后无限循环。但是有必要让学生拥有“老师”属性,否则在不指定相应老师的情况下如何
insert
新学生? 最佳答案
这也可以解决ORM被创建的这种问题。
如果您需要学生与教师之间的双向关系,则确实应该执行一次获取关系。
我注意到在您的示例中,您要加载教师,还需要加载其关系。
在某些情况下这可能是理想的,但在其他情况下则是不希望的。因此,您可能应该将此功能参数化。我将在稍后详细说明这一点。
在您的情况下,我可能会在findWithStudents(int teacherId)
中定义TeacherDAO
,以将教师和代表加载到find(int studentId, Teacher teacher)
中的StudentDAO
以加载学生。
通过这种方式,在StudentDAO
中,该方法知道教师已经加载,并且不会再次加载它。
如果说得通,那么在某些其他情况下您可能会过载。
例如,findWithTeacher(int studentId)
中的StudentDAO
同时加载学生和老师,或者find(int teacherId)
中的TeacherDAO
仅加载老师。