我有一个审核表,这是由不同的courses.A学生应该检讨自己,他在每个month.The数学,科学,历史招收课程表的多个对象了课程,但我存储在审查表的外键因此,对于每一个课程审查与相应的表关联。
注:学生只能在两门课程被登记
@Entity
class Review{
//multiple time fields here here
@OneToOne(cascade=CascadeType.ALL,optional=true)
@JoinColumn(name="math_review_id")
Math m;
@OneToOne(cascade=CascadeType.ALL,optional=true)
@JoinColumn(name="science_review_id")
Science s;
@OneToOne(cascade=CascadeType.ALL,optional=true)
@JoinColumn(name="history_review_id")
History h;
}
超类
@MappedSuperclass
class Course {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
int id;
@ManyToOne(fetch = FetchType.LAZY,
cascade = { CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH },
)
@JoinColumn(name = "student_id")
private Student student;
}
子类历史
@Entity
class History extends Course{
//fields specific to history course
}
子类数学
@Entity
class Math extends Course{
//fields specific to math course
}
学生类
@Entity
class Student{
//fields name,id,...
@OneToMany(mappedBy = "student",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
private List<Review> reviewsList;
}
我检查什么课程,学生在就读并初始化数学,科学,历史accordingly.I通过评论反对我reviews.jsp和使用hibernate.I不初始化学生没有报名参加中课程保存返回@ModelAttribute。我以为未初始化的对象不会被保存,但休眠使得即使未初始化(我想是因为它们映射到表,是一个持久化类内)空条目。 我需要帮助如何动态构造评价对象只是与学生就读in.My当前的设计可能需要流动,没有更好的设计建议大加赞赏课程(我在Java中最小的经验和休眠)
作为一个建议,我认为你应该厌倦创建每门课程的一类。 这岂不是足够了一个Course
具有类型的成员,这可能是数学,科学或历史课。 即使是类型本身可能是一个实体: CourseType
,你可以有条目,以便在你的代码就没有Math
, Science
或History
。 相反,那些在数据库中,而不是代码。
该Review
才把对象将与互动Course
。 试想想,也是所有你需要做的,当你添加其他课程的工作。 你将不得不更新许多不同的文件,甚至在你的数据库中添加一个表,我不相信你应该需要做的。
我想你可能有课程班之间的一些差异,这可能是一个有点尴尬有一个类中的所有这些。 但是从我的经验,这通常是值得做的,因为它极大地减少了代码量,并允许无代码添加更多的课程。
编辑我仍然强烈建议您考虑重新评估你的每一个课程1班的决定,但无论如何,你的决定。 这真的不清楚这个评论的对象是什么。 你说,只有2个课程的学生将被登记,所以我想像,这些领域的2为空,那么。 但后来它混淆了我,因为你必须每场一类,但你必须在所有科目的复习overeaching对象。 我本来期望看到:
class EnrolementReview{
Course courseA;
Course courseB;
}
否则,如果您的评论取决于在你的领域Math
或Science
课程,我希望有每门课程的评论类:
class MathReview {
MathCourse course;
}
或者你可能有审查的通用基础类
abstract class CourseReview<C extends Course> {
C course;
}
如果你有他们之间共同的功能。 然后在一个学期审查2班的SemesterReview类:
class SemesterReview{
CourseReview review1;
CourseReview review2;
}
至于dynamic composition
,海事组织我不认为它使多大意义,在静态类型语言这一概念。 你必须生成器模式和蛋糕图案等。 一些编程语言有一些不错的东西,在这方面像斯卡拉特质,但好处是非常有限的,没有什么你不能用Java做等上几类投下这是有点邪恶的,但它能够完成任务。
对于设计模式,并为开发人员提供给您的方法所有的多少排列,我认为这是一个有点容易看一些你的设计决定的输出,如:
- 有多少班我该怎么写?
- 我将能够无需编写代码,并更改数据库表中添加更多的课程?
- 别人能理解我的代码?
最后编辑在问候许多空字段是一个问题,你有一些选择。 要么你有空字段(你好像不喜欢的),或者你这样做封装的变量类型为一个实体(例如每门课程都有字符串,整数,双打等的列表),这是我见过的使用相当在许多不同的情况一下。 可以算出确定,但你这样做耽误一些地区可能已被编译到运行时,你可能需要其中有一个变量名的整数scienceCategory
等,也可以是尴尬的,如果你有一些结构化的数据。 一般来说这种方法是唯一的好,如果你真的不知道客户将如何使用您的系统,所以你暴露更多的给他们使用。
但是我个人最喜欢的,就是按照你的类的天然成分,并封装的变量家庭陷入了自己的阶级,你希望不会永远是适用的,如如果一个人不适用所有的人不会是要么。 这些类是否存在逻辑应该是很明确的。然而,无论是他们应该是Optional<ScienceInformation>
或你应该有一些方法的地方,它返回一个boolean
这个选项是否应该存在与否。 然后操作可以在您创建系统这些选项进行。 只是要小心不要创建这些嵌套太深作为其是由对象,其是由对象的对象,对象,(并不总是一个问题,但它通常是)。
不过说真的,我不认为这是你选择什么样的方式超级重要的是,他们都不会给你舒适的感觉,写一个类给你。 只需要想想你是如何的方式,不会导致你的未维护的混乱将抽象了这些实体(如课程)。 很显然你有你的域的一个非常完整的知识,但你应该写代码的方式,我(人谁不知道有多少课程是一学期)可读取代码,然后发现了没有阅读评论(将被欺骗),这个问题的答案的问题是什么。