Spring data mongodb 中实体继承是如何实现的

Use*_*321 6 mongodb spring-data-mongodb

我有两个实体 Person、Employee 和 Employee1。我想在 Spring Data MongoDB 中实现实体继承。与 Spring Data JPA 中一样,Spring Data MongoDB 中 @Inheritance 和 @PrimaryKeyJoinColumn 的等效注释是什么。现在,我已经实现了这样的事情:

interface Person {
    String getId();
    void setId(String id);

    String getName();
    void getName(String name);
}

@Document(collection = "person")
class PersonImpl implements Person {
    @Id
    String id;
    // Getters and setters 
    // Constructors, equals, hashcode and toString methods
}

interface Employee extends Person {
    int getNumberOfDependents();
    void getNumberOfDependents(int numberOfDependents);
}

@Document(collection = "employee")
class EmployeeImpl extends PersonImpl implements Employee {
    // Getters and setters 
    // Constructors, equals, hashcode and toString methods
}

interface Employee1 extends Person {
    int getNumberOfDependents();
    void getNumberOfDependents(int numberOfDependents);
}

@Document(collection = "employee1")
class Employee1Impl extends PersonImpl implements Employee1 {
    // Getters and setters 
    // Constructors, equals, hashcode and toString methods
}

Repository structure:
public interface PersonRepository extends MongoRepository<Person, String> {
}

public interface EmployeeRepository extends MongoRepository<Employee, String> {
}

public interface Employee1Repository extends MongoRepository<Employee1, String> {
}
Run Code Online (Sandbox Code Playgroud)

我首先保存 Person 对象,然后获取它的 ID,创建具有相同 ID 的 Employee 对象并保存它。这会创建新对象,因此我会丢失所有 Person 对象的内容。我还觉得我还必须实现 NoRepositoryBean。我很困惑。请帮忙。

Uri*_*oya 3

这是一种方法:

@Document(collection = "person")
class Person {
    @Id
    String id;
    // Getters and setters 
    // Constructors, equals, hashcode and toString methods
}
Run Code Online (Sandbox Code Playgroud)

请注意,集合字段指的是“人员”而不是“员工”

@Document(collection = "person")
class Employee extends Person {
    String jobTitle;
    // Getters and setters 
    // Constructors, equals, hashcode and toString methods
}
Run Code Online (Sandbox Code Playgroud)

在此方法中,您不需要为每个派生类创建存储库

@Repository
public interface PersonRepository extends MongoRepository<Person, String> {}
Run Code Online (Sandbox Code Playgroud)

代码示例:

@Autowired
private PersonRepository personRepo;

public void test() {
  Employee employee = new Employee("1", "teacher")
  personRepo.save(employee)

  Optional<Person> optionalPerson = personRepo.findById("1");
  Employee employeeFromDb;
  if (optionalPerson.isPresent()) {
     employeeFromDb = (Employee)optionalPerson.get()
  }
  else {
     // could not find in db
  }
}
Run Code Online (Sandbox Code Playgroud)