std::remove не удаляет фактические объекты, а скорее толкает их в конец контейнера. Фактическое удаление и освобождение памяти выполняется путем удаления. Итак:
(1). Существует ли использование std :: remove, кроме использования его с функцией стирания.Да, это помогает получить пару итераторов в новую последовательность, не беспокоясь о надлежащем де-распределении и т. д.
(1). Существует ли использование std :: remove, кроме использования его с функцией стирания.
(2). Даже после выполнения std :: remove, почему a.size () возвращает 2, а не 1?
Вы также можете добавить дополнительный метод к своему родителю, например
public void addChild (дочерний ребенок)
, который делает что-то вроде
child.setParent (это);
Проблема заключается в том, что в test1 () вы сохраняете дочерний элемент до сохранения родителя. В test2 () вы сначала сохраняете родителя, а потом ребенка, что правильно, и почему он работает.
Подумайте об этом таким образом. Можете ли вы родиться до рождения матери и отца? Нет, они должны существовать, прежде чем вы сможете существовать. Введите родительский элемент, а затем дочерний элемент, как вы это делаете в test2 ().
Если вы хотите, вы можете отредактировать родительский адрес. SAW (), чтобы сохранить или обновить любые связанные дети. Таким образом, они сохраняются с 1 вызовом.
Основная проблема в test1 () заключается в том, что вы не устанавливаете родительский объект в дочернем объекте. вы должны сказать .. child.setParent (родительский). просто установка дочернего элемента в родительском не означает, что ребенок знает родителя. на самом деле, его ребенок, который владеет отношениями. поэтому необходимо установить родительский объект в дочерний объект. последовательность вызова saveorUpdate () для родителя или дочернего объекта несущественна.
test2 () работает, потому что вы установили родительский элемент в дочерний объект, вызвав child.setParent (). Это отсутствует в test1 ().
У меня есть хорошее решение для этого случая: D
mappedBy означает inverse = "true". поэтому вы должны инвертировать = "false"
попробовать ..
@OneToMany (fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) // javax. persistent.CascadeType @JoinColumn (name = "parent_id") // открытый ключ родительского ключа Public & lt; Child & gt; getChildren () {вернуть детей; }
Надеюсь, это будет хорошо работать
Прежде чем сохранить родителя, ему не был присвоен идентификатор. Итак, когда вы сначала сохраняете ребенка, у него нет внешнего ключа для сохранения. Вы хотите сделать это, как test2 (), но завершите транзакцию. Посмотрите здесь . Я думаю, что раздел под названием «Демаркация транзакций с EJB / CMT» может быть тем, что вы хотите.