与 DAO 模式的对称关系
Posted
技术标签:
【中文标题】与 DAO 模式的对称关系【英文标题】:Symmetric relation with DAO pattern 【发布时间】: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
一个新学生而不指定相应的教师?
【问题讨论】:
【参考方案1】:那也是为了处理ORM创建的这类问题。
如果您需要学生和教师之间的双向关系,您确实应该执行一次关系获取。
我注意到,在您的示例中,您想要加载 Teacher 以及它的关系。 这在某些情况下可能是可取的,但在其他情况下是不可取的。所以你可能应该参数化这个特性。我将很快详细说明这一点。
在您的情况下,我可能会在 TeacherDAO
中定义 findWithStudents(int teacherId)
以加载教师和代表到 StudentDAO
中的 find(int studentId, Teacher teacher)
以加载学生。
这样在StudentDAO
中,方法就知道老师已经加载过了,不会再加载了。
如果说有道理,那么您可能会在其他一些情况下超载。
例如,StudentDAO
中的findWithTeacher(int studentId)
会同时加载学生和教师,或者TeacherDAO
中的find(int teacherId)
只会加载教师。
【讨论】:
以上是关于与 DAO 模式的对称关系的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate GenericDAO 用于父/子关系和 DAO/DTO 模式
数字信号处理傅里叶变换性质 ( 序列对称分解定理示例 | 共轭对称序列与原序列之间的关系 | 共轭反对称序列与原序列之间的关系 )