Почему Hibernate не устанавливает ссылку дочернего элемента на родителя?

Рассмотрим класс Parent:

{
    ...
    @OneToMany(cascade=CascadeType.ALL,mappedBy = "parent")
    Set<Child> children;
    ...
}

И класс Ребенок:

{
    ...
    @ManyToOne
    @JoinColumn(name="parentID")
    Parent parent;
    ...
}

Если я создаю новый дочерний элемент внутри приложения и помещаю его в поле children родительского объекта, а затем сохраняю родительский объект, почему Hibernate не обновляет родительское поле автоматически (чтобы установить столбец parentID) дочернего объекта?


person user42768    schedule 02.04.2016    source источник


Ответы (1)


Потому что Hibernate — не волшебный инструмент. Он предназначен для использования POJO, которые вы разрабатываете и пишете, и не изменяет байт-код этих POJO. Вы несете ответственность за инициализацию другой стороны ассоциации, если вам это нужно.

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

Но ничто не мешает вам иметь метод

public void addChild(Child c) {
    this.children.add(c);
    c.parent = this;
}
person JB Nizet    schedule 02.04.2016
comment
Ему не нужно было бы изменять байт-код. Не может ли он просто проверить, когда родительский объект сохранен, заполнены ли дочерние элементы, и если да, то обновить ссылку внутри дочернего объекта? - person user42768; 02.04.2016
comment
Как он решит, хотите ли вы, чтобы потомок был добавлен к родителю или нет, поскольку оба объекта не сообщают одно и то же? Родитель говорит: да, это один из моих детей. Ребенок говорит: нет, у меня нет родителей. Итак, кому следует верить Hibernate? Ребенок или родитель? Спецификация решила: ей должен верить владелец ассоциации, которым является ребенок. - person JB Nizet; 02.04.2016
comment
Я думал об этом случае, но я считал, что логичному владельцу ассоциации следует верить. Теперь я понимаю, что такой подход может вызвать серьезные проблемы. Спасибо! - person user42768; 02.04.2016
comment
код, который вы показываете выше, предназначен для однонаправленных или двунаправленных отношений? Извините, если мой вопрос слишком тривиален, на этой неделе я начал с hibernate/JPA/Springboot. - person Asma Rahim Ali Jafri; 04.10.2019
comment
@AsmaRahimAliJafri вы должны быть в состоянии понять это самостоятельно: если в отношениях две стороны, и если код показывает, что у this есть дети, а у children have a parent which is this`, то по определению это двунаправленная ассоциация. Если бы он был однонаправленным, то либо у дочерних элементов не было бы родителя (таким образом, это был бы однонаправленный OneToMany от родителя к дочерним), либо у родителя не было бы дочерних элементов (таким образом, это был бы однонаправленный ManyToOne от дочернего к родительскому). - person JB Nizet; 04.10.2019