Spring Boot сохраняющиеся объекты с отношениями

"(?:\\"|.)*?"

Чередование \" и . проходит через экранированные кавычки, в то время как ленивый квантификатор *? гарантирует, что вы не проходите мимо конца строки с кавычками. Работает с классами .NET Framework RE

0
задан MichaelB 13 July 2018 в 16:23
поделиться

1 ответ

Ну, это похоже на бесконечную рекурсию. A Person имеют много Cars. Car имеют один владелец, который является Person.

Просто предложение:

Когда вы возвращаете свою сущность, Spring ожидает наличия Person (владельца) внутри вашей структуры Car JSON и списка Car внутри вашего Person. Это может быть проблемой, если вы хотите получить данные, поскольку она создаст бесконечную рекурсию. Вам нужно добавить тип fetch для LAZY, чтобы предотвратить эту рекурсию.

@OneToMany(mappedBy="owner", cascade=CascadeType.ALL, fetch = FetchType.LAZY)

Теперь, для вашего вопроса, как я уже сказал, ваш Car должен иметь Person ], но в вашем запросе вы не укажете Person (владелец), поэтому Spring не знает, кто является владельцем. Это основная проблема.

Я предлагаю вам обновить их отдельно:

@PutMapping("/people/{id}")
public ResponseEntity <?>handleUpdate(@PathVariable("id") Long personId, @RequestBody Person person) {
    Optional <Person> personOptional = personRepository.findById(personId);

    if (personOptional.isPresent()) {
        Person owner = personOptional.get();

        for (Car car: person.getCars()) {
            car.setOwner(owner);
        }

        carRepository.saveAll(person.getCars());

        person.setCars(null);
        person.setId(personId);
        personRepository.save(person);
    }

    return...;
}

В этом примере я обновляю их отдельно, но одним методом. Конечно, вам нужно будет автоувеличивать как PersonRepository, так и CarRepository

UPDATE:

. Если вы не обходитесь каким-то образом, вам нужно будет запросить JSON структура выглядит следующим образом:

{
  "id": 1,
  "name": "Joe",
  "cars": [
    {
      "car_id": 1,
      "color": "red",
      "owner" : 
      {
        "id": "1"
      }
    },
    {
      "car_id": 2,
      "color": "blue",
      "owner" : 
      {
        "id": "1"
      }
    }
  ]
}
0
ответ дан Matheus Cirillo 17 August 2018 в 12:24
поделиться
  • 1
    Это не бесконечно, они просто взаимозаменяемы. Это становится бесконечной проблемой, когда вы пытаетесь сериализовать отношения для json, но реальная вещь имеет @JsonIgnoreProperties, чтобы блокировать обратные ссылки. Обходной путь, который я создал, - это обрабатывать каждый отдельный объект отдельно, но это кажется ненужным, когда вся необходимая информация находится прямо там. – MichaelB 13 July 2018 в 18:39
  • 2
    @MichaelB Понял. Фактически, обходной путь не является ненужным. Вы не указываете, кто Person, поэтому, когда Spring десериализует ваш JSON для объекта, владелец Car - null, потому что в вашей структуре JSON Car нет "owner" : "....". В любом случае, надеюсь, что это решает вашу проблему – Matheus Cirillo 13 July 2018 в 18:44
  • 3
    «Владелец» на автомобиле находится «человек», которые являются «автомобилями». список содержит этот автомобиль. В БД это определяется только с одной стороны отношения. (Car.person_id) В json он также определен один раз. Нет никакой двусмысленности. – MichaelB 13 July 2018 в 18:47
  • 4
    @MichaelB Конечно, это он. Вы знаете это, и я это знаю, но Весна этого не знает. Когда Spring deserialize, они являются отдельными объектами. Вот почему владелец Car отправляется как null. Я обновил свой ответ с помощью наблюдения – Matheus Cirillo 13 July 2018 в 18:56
Другие вопросы по тегам:

Похожие вопросы: