Как вставить несколько дочерних объектов в одного и того же родителя с наследованием JPA? - PullRequest
0 голосов
/ 01 февраля 2019

По сути, у меня есть проблема, аналогичная описанной в этом вопросе: jpa, как создать новую сущность с тем же идентификатором, что и у родительской сущности (JOINED Inheritance)

Но так как этому вопросу 9 летЯ надеюсь, что сегодня есть решение этой проблемы.

Вот моя проблема: Я использую наследование сущностей с присоединенным типом наследования.

Сущности: 1. Лицо 2Доктор (расширяет Лицо) 3. Профессор (расширяет Лицо)

Вот моя актуальная проблема:

  • Когда я создаю Доктора,данные заполнены в таблицах «Доктор» и «Человек» с одним и тем же идентификатором, скажем, id = 1 ==> Пока все хорошо

  • Когда я создаю профессора, данные заполняются в таблицахПрофессор и Персона с одним и тем же идентификатором, скажем, id = 2 ==> Пока все еще хорошо

  • Когда существующий Доктор (id = 1) теперь также становится Профессором (или заместителем)наоборот), я хочу, чтобы Персона и Доктор сохранялись с одним и тем же идентификатором, и просто добавляюпопробуйте в таблице Профессор, также с 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)
}

Итак, перед выполнением метода вот какие строки у меня в базе данных:

Person:

  • id 1
  • id 2

Доктор:

  • ИД 1

Профессор:

  • ИД 2

Вот чего я хочу достичь:

Человек:

  • id 1
  • id 2

Доктор:

  • ИД 1

Профессор:

  • ИД 1
  • ИД 2

Вот что я получаю:

Персона:

  • id 1
  • id 2
  • id3 (те же значения, что и 1)

Доктор:

  • идентификатор 1

Профессор:

  • идентификатор2
  • id 3

Буду признателен за любую помощь, даже если это невозможноМожет быть, намек на то, как решить эту проблему, используя другой подход к модели сущностей или что-то еще.

Заранее спасибо, ребята!

1 Ответ

0 голосов
/ 01 февраля 2019

Я думаю, что вы хотите достичь, это скорее образец для подражания, чем наследство.Есть ли причина, по которой вы не назначаете роли человеку, например:

class Person {

  @ManyToMany
  private Set<Role> roles;

}

Вкус @ManyToMany, конечно, зависит от природы Role - будь то Enum или обычный объектсама по себе.

Кроме того: по какой причине вы заботитесь о идентификаторах самостоятельно и не позволяете базе данных справиться с этим, предпочтительно с использованием генератора последовательности?Вместо копирования атрибутов объекта лучше использовать внешние ключи и, возможно, идентифицировать людей по их @NaturalId, например, по адресу электронной почты и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...