如何通过JPA继承将多个子实体插入同一个父实体?

时间:2019-02-01 14:49:46

标签: java spring jpa inheritance

基本上,我有与此问题类似的问题: jpa how to create new entity with same id as parent entity (JOINED Inheritance)

但是由于这个问题已有9年历史了,所以我希望今天能够解决这个问题。

这是我的问题: 我正在使用继承类型已加入的实体继承。

实体是: 1人 2.医生(扩展人员) 3.教授(扩展人)

这是我的实际问题:

  • 当我创建Doctor时,数据填充在具有相同id的Doctor和Person表中,可以说id = 1 ==>到目前为止一切都很好

  • 当我创建Professor时,数据填充在具有相同id的Professor和Person表中,可以说id = 2 ==>到目前为止,一切仍然很好

  • 当现有的医生(id = 1)现在也成为了教授时(反之亦然),我希望“人”和“医生”使用相同的id继续存在,只需将表中的条目添加到“教授”中, id = 1。

以下是一些有关如何使医生也成为教授的代码:

public void makeDocAlsoProf(id){

// Find existing Person
List<Person> persons = personRepo.findById(id);
Person foundPerson = !persons.isEmpty() ? persons.iterator().next() : null;

prof = new Professor(foundPerson); //This copies all parent Person fields
prof.setId(foundPerson.getId()); // Set the same id (id = 1)

prof = professorRepo.save(prof); // This gives Prof a new id (id = 3)
}

因此,在执行该方法之前,这是我在数据库中拥有的行:

人员:

  • id 1
  • id 2

医生:

  • id 1

教授:

  • id 2

这是我要实现的目标:

人员:

  • id 1
  • id 2

医生:

  • id 1

教授:

  • id 1
  • id 2

这就是我得到的:

人员:

  • id 1
  • id 2
  • id 3(与1相同的值)

医生:

  • id 1

教授:

  • id 2
  • id 3

我将不胜感激,即使无法实现,也可能暗示如何使用其他实体模型方法或其他方法解决此问题。

预先感谢大家!

1 个答案:

答案 0 :(得分:0)

我认为您想要实现的更多是角色模型而不是继承。您是否没有将角色分配给某人的原因,例如:

class Person {

  @ManyToMany
  private Set<Role> roles;

}

@ManyToMany的风格当然取决于Role的性质-它是枚举还是常规对象本身。

此外:您自己关心ID并且不让数​​据库处理该ID的原因是什么(最好使用序列生成器)?您应该使用外键而不是复制对象属性,并可能通过其@NaturalId来识别人员,例如电子邮件地址等。