JPA (переход в спящий режим) отношение OneToMany и null

#jpa #one-to-many

#jpa #один ко многим

Вопрос:

У меня есть отношение OneToMany между классом Resident и ResidentInfo Предполагается, что ResidentInfo не существует без Resident, но ResidentInfo не требуется

Вот мои классы:

 public class Resident {
...
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "resident")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    public List<ResidentInfo> infos;
}

public class ResidentInfo {
...
    @ManyToOne(optional = false)
    public Resident resident;
    public String label;
    public String value;
}
  

Я новичок в JPA и, возможно, я что-то делаю неправильно.

Проблема в том, что когда я пытаюсь вставить все данные сразу (одновременно создать резидентную и ее информацию), я получаю исключение null.

Это потому, что ResidentInfo.resident.id равно null (но я не могу указать значение, потому что резидент создается в то же время !)

Также, даже если резидент создается первым, у меня возникает эта ошибка, но я не знаю, почему :

 detached entity passed to persist: models.ResidentInfo
  

Итак, как решить эти проблемы?

Ответ №1:

Чтобы решить вашу проблему, вы должны сначала предоставить метод setter в классе ResidentInfo для установки резидентного объекта, к которому принадлежит экземпляр info. Это может выглядеть следующим образом

 public void setResident(Resident resident) {
    this.resident = resident;
}
  

Кроме того, добавление объекта ResidentInfo к резидентному объекту должно выполняться только в резидентном классе. Вы должны предоставить метод для добавления нового объекта ResidentInfo в содержащийся список. Частью добавления объекта ResidentInfo было бы установить резидентный объект, который связан с ним. Код мог бы выглядеть примерно так

 public void addResidentInfo(ResidentInfo residentInfo) {
    residentInfo.setResident(this);
    infos.add(residentInfo);
}
  

С помощью этих строк каждый объект в списке содержит ссылку на резидентный экземпляр, который связан с ним. Таким образом, когда вы сохраняете все объекты, устанавливаются необходимые ссылки (а также любой требуемый идентификатор).

Кстати, вам следует проверить информацию о вашем каскаде в аннотации JPA. Вы предоставили две разные аннотации с совершенно разным значением.

Комментарии:

1. Привет, я подавил «cascade = {CascadeType. СОХРАНЯЕТСЯ, CascadeType. СЛИЯНИЕ, CascadeType.REFRESH}» это правильно? Также я протестировал ваш код, это работает только частично, когда я хочу добавить новый ResidentInfo к существующему residentinfo, это не работает

2. Что вы имеете в виду, это не работает? Каков результат при добавлении нового ResidentInfo с использованием указанного метода?

3. У меня нет ошибки, но все записи ResidentInfos не вставлены

4. Не могли бы вы предоставить фрагмент кода, в который вы добавляете записи ResidentInfo?

5. Я решил проблему, это было вызвано тем, что мой список не был инициализирован, что вызвало исключение null