Я был назначен на проект из моего университета с использованием 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 (), то происходит сбой, потому что «загруженный объект был неправильного класса».
Я не знаю, что теперь делать.