Установка идентификатора отношения OneToMany при сохранении сущности - PullRequest
0 голосов
/ 09 января 2019

У меня есть приложение гибернации, в котором я хочу сохранить владельца.

Один владелец может иметь много животных

(внутри субъекта-владельца)

   @OneToMany(mappedBy = "owner")
private List<Animal> animals;

(внутри животного существа)

  @ManyToOne
private Owner owner;

У меня есть хранилище, где я сохраняю своего владельца,

   @Override
public Owner create(String name, String email, int age, 
List<Animal> animals) {
    Owner owner = new Owner(name, email, age, animals);
    for(Animal animal: animals){
        animal.setOwner(owner);
    }
    getEntityManager().persist(owner);
    return owner;
}
}

владелец сохраняется правильно, но внешний ключ не задан в таблице животных.

Я использовал отладчик, чтобы проверить, правильно ли указан владелец для животного, которым оно является.

Сначала я попытался сохранить животное, которое вызвало ошибку

   for(Animal animal: animals){
        animal.setOwner(owner);
        getEntityManager().persist(animal)
    } //caused an error

поэтому я подумал об использовании каскадного типа, чтобы животное получило идентификатор владельца в базу данных,

@OneToMany(cascade = CascadeType.ALL)
private List<Animal> animals;

это также вызвало ошибку

 "cause": {
  "detailMessage": "detached entity passed to persist: com.tolboll.zoo.data.entities.Animal",
  "stackTrace": [],
  "suppressedExceptions": []
},

как мне сделать так, чтобы владелец правильно сохранился в животном существе?

EDIT:

вот тело JSON, переданное в

  {
    "name": "kristoffer",
    "email": "Kristofferlocktolboll@gmail.com",
    "age": 23,
    "animals": [{
        "id": 1,
        "name": "Simba",
        "weight": 110,
        "species": {
            "id": 1,
            "name": "Lion"
        }
    }]
}

1 Ответ

0 голосов
/ 09 января 2019

Вы получаете эту ошибку, потому что пытаетесь сохранить отдельную сущность: Animal.

Решение

В сущности Владелец оставьте как есть (хотя CascadeType.MERGE достаточно):

@OneToMany(cascade = CascadeType.ALL)
private List<Animal> animals;

Затем в методе create замените persist на merge:

getEntityManager().merge(owner);

Причиной этого является операция слияния, необходимая для списка animals.

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