JPA (в спящем режиме) отношения OneToMany и ноль - PullRequest
0 голосов
/ 10 мая 2011

У меня есть отношение 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 и, возможно, я делаю что-то не так.

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

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

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

detached entity passed to persist: models.ResidentInfo

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

1 Ответ

2 голосов
/ 10 мая 2011

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

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

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

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

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

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

...