Я выполняю сохранение родительского ребенка с помощью CASCADE.PERSIST

@Entity
@Table(name = "parent")
public class Parent extends AbstractAuditingEntity{

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
    @JoinColumn(name = "parent_id",nullable = false)
    private List<Child> children;

}


@Entity
@Table(name = "child")
public class Child extends AbstractAuditingEntity{

    @Column(name = "parent_id", insertable=false, updatable=false)
    private Long parentId;

}

Когда я сохраняю родителя, ребенок также сохраняется вместе с внешним ключом.

parent = parentRepository.save(parent);

Но объект, возвращаемый из репозитория, не имеет внешнего ключа, установленного в дочернем элементе.

child.getParentId () имеет значение null.

Как я могу это сделать?


Пытался установить родительский элемент в дочернем элементе, но существует такая же проблема

@Entity
@Table(name = "child")
public class Child extends AbstractAuditingEntity{

    @ManyToOne
    @JoinColumn(name="parent_id",nullable = false,insertable=false,updatable=false)
    private Queue queue;
}

Хотя это не критическая проблема (я могу установить ее вручную из родителя) - просто хотел убедиться, правильно ли я делаю.

0
lives 1 Янв 2018 в 10:55

2 ответа

Лучший ответ

Как указал Дж. Б. Низет, двунаправленное отображение было неверным.

Это было исправлено согласно приведенной ниже ссылке, и все работало нормально

https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

0
Vlad Mihalcea 6 Янв 2018 в 10:08

Никакого волшебства при сохранении не происходит. Это означает, что если вы не установите parentId, это поле будет пустым. Вы должны установить это самостоятельно.

Когда вы читаете данные с помощью find или с помощью запроса, поле будет установлено JPA.

0
Simon Martinelli 3 Янв 2018 в 09:24