【问题标题】:How to insert multiple child entities to the same parent with JPA inheritance?如何使用 JPA 继承将多个子实体插入同一个父实体?
【发布时间】:2019-02-01 14:49:46
【问题描述】:

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

但由于这个问题已有 9 年历史,我希望今天能找到解决这个问题的方法。

这是我的问题: 我正在使用带有继承类型的实体继承。

实体是: 1人 2.医生(延伸人) 3. 教授(延伸人)

这是我的实际问题:

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

  • 当我创建教授时,数据填充在具有相同 id 的教授和人员表中,假设 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

我将不胜感激,即使这不可能,也可能是关于如何使用不同的实体模型方法或其他方法解决此问题的提示。

提前谢谢各位!

【问题讨论】:

  • 可以放你的型号代码吗?
  • 所以基本上你的映射是:一个人也可以是医生和教授。您可以发布模型源代码吗?

标签: java spring jpa inheritance


【解决方案1】:

我认为您想要实现的更多的是角色模型而不是继承。您是否有理由不为某个人分配角色,例如:

class Person {

  @ManyToMany
  private Set<Role> roles;

}

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

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

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2023-03-19
    • 2015-06-24
    • 2018-12-08
    • 2019-04-17
    • 1970-01-01
    • 2020-12-10
    • 2012-11-11
    相关资源
    最近更新 更多