Spring数据,继承和mongodb [关闭]

问题描述 投票:0回答:2
我正在尝试了解如何正确执行此操作。

请考虑以下情况:

enter image description here

我想将此模型保留到mongodb。

选项1:我应该将ProfessorStudent保留到不同的集合(表)吗?

选项2:

我是否将它们放入personsDao集合中,并在其中保存人员和所有其他专门属性(来自“教授”和“学生”类)的type。当我从数据库中检索数据时,我将其转换为正确的类?这意味着,我只有一个@Repository接口。
spring mongodb spring-data-jpa spring-data spring-data-mongodb
2个回答
1
投票
我认为这两个选项都是可行的方法,但是我更喜欢选项1。因此,最好在代码库中放置抽象人类,并将教授和学生划分到不同的表(数据库层)中,这样可以更轻松地处理自定义属性,稍后。

1
投票

使用选项2-单人娱乐场

显然,您可以使用

选项2

,因为两个实体都具有您在Person(抽象类)中声明的相同属性。尽管在您当前的设计中采用这种方法很有意义,但是您还需要考虑未来的方面。
我是否将它们放入personsDao集合中,并在其中保存人的类型和所有其他专业属性(来自“教授”和“学生”类)。

是的!您只能使用一个存储库来存储两种类型的实体,并在type中添加属性(Person)。您的Person类应如下所示,

public abstract class Person { // common properties private PersonType type; // getters/ setters public enum PersonType { STUDENT, PROFESSOR } }

当我从数据库中检索数据时,将其转换为正确的类吗?

投射到适当的类中似乎很有希望,但我建议您不要这样做。

为什么?

假设您有getAllStudentssaveStudent方法,并且可能看起来像这样,

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相关联,或者ProfessorClass相关联-您的设计是否可以采用?不可能吧?尽管这些对于当前需求可能不是必需的,但是您可以灵活地将它们分开。而且,单独的存储库将更加整洁,将不再需要映射,并且对每个实体都负有单一责任。

public List<Student> getAllStudents() { return studentRespository.findAll(); } public Student save(Student person) { return studentRespository.save(person); }

取决于您的要求和设计,选择一种方法-但我更喜欢采用第一种方法。
© www.soinside.com 2019 - 2024. All rights reserved.