Как мне сохранить, что только отношение сохраняется / объединяется с базой данных в JPA / Hibernate? - PullRequest
0 голосов
/ 26 апреля 2018

Пример: У меня есть объект Person, который имеет отношение ManyToMany к объекту Citizenship. Лицо лица:

    // annotations
    @Entity
    public class Person {

      // ...
      @ManyToMany(
        fetch = FetchType.LAZY,
        cascade = {CascadeType.PERSIST, CascadeType.MERGE}
      )
      @JoinTable(
        name = "persons_citizenships",
        joinColumns = {@JoinColumn(name = "PERSON_ID")},
        inverseJoinColumns = {@JoinColumn(name = "CITIZENSHIP_ID")}
      )
      private Set<Citizenship> citizenships = new HashSet<>();
      // ...
      // setters and getters
    }

И гражданство субъекта:

    // annotations
    @Entity
    public class Citizenship {

      @ManyToOne
      private Country country;
    }

Теперь проблема заключается в следующем: если я получил объект для обновления Person в службе REST и если я получил следующий объект Person, сериализованный из json:

{
  "id": 2,
  "firstName": "Johnny",
  "citizenship": [
    {
      "id": 2,
      "country": {
        "id": 128
      }
    }
  ]
}

все идет хорошо, и человек обновляется. Но проблема возникает, если кто-то вызвал мою службу, но не предоставил всю информацию для объекта гражданства, например, идентификатор страны. В этом случае, когда JPA объединяет эту организацию, она переходит в гражданство и устанавливает нулевое значение для идентификатора страны, и для меня это большое нет, нет. Пример JSON для этого случая:

{
  "id": 2,
  "firstName": "Johnny",
  "citizenship": [
    {
      "id": 2
    }
  ]
}

Что я могу сделать, чтобы сохранить или объединить только RELATIONS , а не сами дочерние объекты. Я имею в виду, что гражданство не меняется, и пользователь моего сервиса не должен менять его через обновление личности. Да, я знаю, что CascadeType.MERGE делает это, но если я удалил его, то даже отношения не сохраняются. Я также не хочу использовать CascadeType.ALL (который включает CascadeType.REMOVE в любом случае, из-за его опасных побочных эффектов, P.S., с которым я столкнулся ранее), если в любом решении это необходимо.

Пожалуйста, предложите что-нибудь для подтверждения этого случая. Это очевидная проблема безопасности для моего приложения, и я не хочу полагаться на намерения пользователя моего сервиса ...

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