请考虑以下情况:
我想将此模型保留到mongodb。
选项1:我应该将Professor
和Student
保留到不同的集合(表)吗?
选项2:
我是否将它们放入personsDao
集合中,并在其中保存人员和所有其他专门属性(来自“教授”和“学生”类)的type。当我从数据库中检索数据时,我将其转换为正确的类?这意味着,我只有一个@Repository接口。使用选项2-单人娱乐场
显然,您可以使用选项2
,因为两个实体都具有您在Person(抽象类)中声明的相同属性。尽管在您当前的设计中采用这种方法很有意义,但是您还需要考虑未来的方面。我是否将它们放入personsDao
集合中,并在其中保存人的类型和所有其他专业属性(来自“教授”和“学生”类)。
是的!您只能使用一个存储库来存储两种类型的实体,并在type
中添加属性(Person
)。您的Person类应如下所示,
public abstract class Person {
// common properties
private PersonType type;
// getters/ setters
public enum PersonType {
STUDENT, PROFESSOR
}
}
当我从数据库中检索数据时,将其转换为正确的类吗?投射到适当的类中似乎很有希望,但我建议您不要这样做。
为什么?
假设您有getAllStudents
,saveStudent
方法,并且可能看起来像这样,
public List<Student> getAllStudents() { return personRespository.findAllByType(PersonType.STUDENT) .map(person -> ((Student) person)) .collect(Collections.toList()); } public Student saveStudent(Student student) { Person person = new Person(); person.setType(PersonType.STUDENT); //copy other properties to the person Person stored = personRespository.save(person); return ((Student) stored); }
您如何看待这些方法?并假设所有其他CRUD方法以及教授方法。不用这样做,只需使用Person
并删除两个冗余实体即可。由于您具有类型属性来区分它们,因此不再需要两个子类,并且重构的方法可能看起来像这样,
public List<Person> getAllStudents() { return personRespository.findAll(); } public Person saveStudent(Person person) { person.setType(PersonType.STUDENT); return personRespository.save(person); }
似乎好多了,对吧?使用选项1-学生和教授的独立存储库
我应该让教授和学生坚持使用不同的收藏品(表)吗?
管理两个实体的两个存储库似乎无关紧要,而这两个实体的所有属性均保持不变,但事实并非如此。例如,当您将来必须增强自己的实体时,例如Student
必须与ScoreSheet
相关联,或者Professor
与Class
相关联-您的设计是否可以采用?不可能吧?尽管这些对于当前需求可能不是必需的,但是您可以灵活地将它们分开。而且,单独的存储库将更加整洁,将不再需要映射,并且对每个实体都负有单一责任。
public List<Student> getAllStudents() {
return studentRespository.findAll();
}
public Student save(Student person) {
return studentRespository.save(person);
}
取决于您的要求和设计,选择一种方法-但我更喜欢采用第一种方法。