基本上,我有与此问题类似的问题: 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)
}
因此,在执行该方法之前,这是我在数据库中拥有的行:
人员:
医生:
教授:
这是我要实现的目标:
人员:
医生:
教授:
这就是我得到的:
人员:
医生:
教授:
我将不胜感激,即使无法实现,也可能暗示如何使用其他实体模型方法或其他方法解决此问题。
预先感谢大家!
答案 0 :(得分:0)
我认为您想要实现的更多是角色模型而不是继承。您是否没有将角色分配给某人的原因,例如:
class Person {
@ManyToMany
private Set<Role> roles;
}
@ManyToMany
的风格当然取决于Role
的性质-它是枚举还是常规对象本身。
此外:您自己关心ID并且不让数据库处理该ID的原因是什么(最好使用序列生成器)?您应该使用外键而不是复制对象属性,并可能通过其@NaturalId
来识别人员,例如电子邮件地址等。