Как сохранить сущность с несколькими полями одного типа, используя JPA? - PullRequest
0 голосов
/ 07 июня 2018

Фон:

У меня есть абстрактный класс MobileResource, который содержит три поля каждого типа Site.Эти поля могут и часто содержат один и тот же объект.

@Entity
public abstract class MobileResource extends Resource implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    private Site homeSite;
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    private Site currentSite;
    @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST})
    private Site relocationSite;

    // constructors, getters, setters
}

У меня также есть Person конкретный подкласс MobileResource.

@Entity
public class Person extends MobileResource implements Serializable {

    private String firstName;
    private String surname;

    // constructors, getters, setters
}

Данный модуль является spring-boot приложение, использующее spring-data-jpa a postgres база данных.Схема базы данных автоматически создается с помощью Spring / Hibernate.

Проблема:

Я пытаюсь сохранить новый экземпляр Person, полученный из внешнего ресурса REST,Когда я использую подпружиненный загрузчик PersonRepository, расширяющий JpaRepository, и звоню personRepository.save(person), я получаю следующее исключение:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-06-07 10:36:30,383 ERROR SpringApplication - Application run failed
java.lang.IllegalStateException: Failed to execute CommandLineRunner
    ... 6 more
Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [fk_rmnbkmxocx4dcayhiyr1wxypc]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
    ... 23 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    ... 56 more
Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "person" violates foreign key constraint "fk_rmnbkmxocx4dcayhiyr1wxypc"
  Detail: Key (current_site_id)=(738) is not present in table "site".
    ... 62 more

Person Столбцы :

id [PK] | batch_id | brigade_id | call_sign | lat | lon | incident_id | type_id | current_site_id | home_site_id | relocation_site_id | status_id | first_name | surname

Site Столбцы:

id [PK] | batch_id | brigade_id | call_sign | lat | lon | location | type_id

Вопрос:

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

Большое спасибо заранее.

Редактировать: Просто чтобы прояснить, я хотел бы иметь возможность сохранить объект Site при сохранении объекта Person вместо предварительного сохранения чего-либо при подготовке к Person.

Одна идея, которая у меня возникла, состояла в том, чтобы использовать первичный ключ удаленного сервера (id) в качестве альтернативного ключа и генерировать свой собственный ключ, используя @GeneratedValue, но я думаю, что это также может вызвать те же проблемы.

Кто-нибудь знает, почему CascadeType.PERSIST не работает в этом случае?

1 Ответ

0 голосов
/ 07 июня 2018

Кажется, что в таблице Site нет строки, где id = 738, поэтому вы не можете вставить эту строку в таблицу Person.

Сначала вы должны попытаться вставить строку в таблицу Site с идентификатором as738, и только потом попытайтесь вставить в таблицу Person.

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