#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