我试图模拟学生和课程之间的关系。以下是我需要支持的2个高级查询:
这种关系是一种M:N关系(多对多,i.s.多个学生注册多个课程)。
我如何根据java对象建模它们。直觉上,学生和课程似乎互相引用,创建循环依赖(或反向引用)。
class Student{
Long id
String name
List<Course> enrolledCourses;
Long rollNumber
}
Course{
Long id
String name
List<Student> enrolledStudents;
}
以上述方式对这些要求进行建模是否是正确的行为。
我有点犹豫要不要创建这样的循环依赖,但不知道如何我可以建模它。
如果我理解你,你有点害怕冗余。如果学生X访问课程Y,则在学生的课程列表中包含课程Y,在课程的学生列表中包含学生X.
如果你注意修改方法,这可能是模拟这种情况的最佳方法。但是如果你害怕最终与学生一起访问他不在的课程(根据课程),你将不得不像在关系数据库中那样创建一个关系对象。
现在,如果你对这种情况有更多想法,可能还有很多关于这次课程访问的内容。学生什么时候参观课程?他做过任何考试吗?结果是什么?哪位教授领导了这个课程的实例?在分析之后,您将对情况有更好的了解。
我的方法通常是先彻底分析情况。然后我分析我对数据的操作。最后,我开始考虑数据的最佳表示。
这在Java中是没有问题的,也是正确的方法。双向关系,经常在两个方向上使用。在JPA中,他们通常会得到一个注释来懒散地获取它们。
事实上,使用JPA注释建模可以让您表达主键,多对一等。
我个人更喜欢long rollNumber
而不是可空的Long rollNumber
。
当然,并不总是一件明智的事情,特别是当实体是从属的时候。