«Продвигать» сущность в расширенную сущность в JPA / Spring - PullRequest
0 голосов
/ 14 апреля 2020

Я был назначен на проект из моего университета с использованием Spring Boot и Angular. В текущей версии есть база данных с таблицей «Пользователь» и таблица «Лектор» и «Студент», которые наследуются пользователем. В бэкэнде у меня есть классы Entity, Repository и Controller для каждой таблицы, чтобы сделать HTML запросов. Вот несколько примеров:

@Entity(name="user")
@Inheritance(strategy = InheritanceType.JOINED)
public class UserEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  private String firstname;
  private String lastname;
  private String email; //unique, not null
  private int addressId; //Foreign Key
  // Getter/Setter
}
@Entity(name="lecturer")
@PrimaryKeyJoinColumn(name = "userid")
public class LecturerEntity extends UserEntity {
  private String academicdegree;
  //...
}

В качестве репозитория я расширил JpaRepositories для UserEntity и LecturerEntity.

В моих классах контроллеров у меня есть Get, Post, Patch и Delete Mappings, все работают хорошо. Я могу создать простой UserEntity, или я могу создать Lecturer- или StudentEntity, который создает унаследованный UserEntity. Но как я могу «продвинуть» существующего простого пользователя, например, в Lecturer?

Я уже много чего перепробовал, например: - Создание нового LecturerEntity только с идентификатором существующего UserEntity - Разрывы, потому что адрес электронной почты не может быть нулевым. Создание нового LecturerEntity со всеми скопированными значениями UserEntity. Разрывы из-за уникального ограничения адреса электронной почты. Создание нового LecturerEntity и сохранение в userRepository. не знаю, почему-Удаление UserEntity и создание нового LecturerEntity -> Breaks, из-за ограничений внешнего ключа Address

Я предполагаю, что при попытке сохранить в lecturerRepository, он пытается найти данный идентификатор, чтобы обновите сущность, и если он не может ее найти, он начинает, вставляя новую сущность со всеми заданными параметрами пользователю «суперкласса», что, очевидно, не работает.

Я также попытался сделать собственный запрос:

entityManager.createNativeQuery("INSERT INTO lecturer (userid, academicdegree) VALUES (?, ?)")
  .setParameter(1, userid)
  .setParameter(2, academicdegree)
  .executeUpdate();

, который корректно вставляет значения в базу данных, но lecturerRepository по-прежнему не может найти объект лектора с указанным идентификатором. И если я пытаюсь выполнить отладку с помощью lecturerRepository.findAll (), то происходит сбой, потому что «загруженный объект был неправильного класса».

Я не знаю, что теперь делать.

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