@OneToMany Заполнение NULL во внешнем ключе таблицы Child [duplicate]

std::remove не удаляет фактические объекты, а скорее толкает их в конец контейнера. Фактическое удаление и освобождение памяти выполняется путем удаления. Итак:

(1). Существует ли использование std :: remove, кроме использования его с функцией стирания.

Да, это помогает получить пару итераторов в новую последовательность, не беспокоясь о надлежащем де-распределении и т. д.

(1). Существует ли использование std :: remove, кроме использования его с функцией стирания.

(2). Даже после выполнения std :: remove, почему a.size () возвращает 2, а не 1?

10
задан Kamil Łoś 26 March 2010 в 08:24
поделиться

5 ответов

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

  public void addChild (дочерний ребенок)  

, который делает что-то вроде

  child.setParent (это);   
11
ответ дан dr jerry 16 August 2018 в 02:36
поделиться
  • 1
    Отлично, реализация этого метода решила мою проблему. Теперь вместо создания нового массива я просто вызываю parent.addChild (child) , где происходит создание нового массива (если необходимо), а затем назначает родительский элемент дочернему элементу. Теперь вызов save () в родительском файле сохраняет оба объекта точно так, как я хотел. Спасибо за идею! – Kamil Łoś 26 March 2010 в 17:53
  • 2
    Спасибо вам большое за ваше время. Не могли бы вы сообщить нам, почему спящий режим не заботится об этом? Или есть способ передать это в спящий режим. – Abdul 26 July 2018 в 06:06
  • 3
    Более 8 лет назад я думал, что Hibernate прекратил свое существование :-) Я нахожусь на других пастбищах (не обязательно более зеленых). Возможно, он изменился, но я предполагаю, что он будет представлять собой всевозможную двусмысленность (родителем которого я являюсь) – dr jerry 26 July 2018 в 07:25

Проблема заключается в том, что в test1 () вы сохраняете дочерний элемент до сохранения родителя. В test2 () вы сначала сохраняете родителя, а потом ребенка, что правильно, и почему он работает.

Подумайте об этом таким образом. Можете ли вы родиться до рождения матери и отца? Нет, они должны существовать, прежде чем вы сможете существовать. Введите родительский элемент, а затем дочерний элемент, как вы это делаете в test2 ().

Если вы хотите, вы можете отредактировать родительский адрес. SAW (), чтобы сохранить или обновить любые связанные дети. Таким образом, они сохраняются с 1 вызовом.

0
ответ дан Kevin Crowell 16 August 2018 в 02:36
поделиться
  • 1
    Спасибо за объяснение. Я думал, что спящий режим позаботится о таких операциях. При просмотре журналов и спящего режима вставки / обновления для test1 () сначала была введена вставка для родителя, а затем для Child. Как я вижу, спящий режим должен быть «умным», чтобы получить вставку «Идентификатор формы», а затем передать ее Ребенку и выполнить вставку. Итак, суммируя - в сценарии, где я хочу вставить 50 детей для одного родителя, мне нужно вызвать save () для каждого из них? Вы уверены, что для спящего режима нет другого способа сделать это «автоматически»? :) – Kamil Łoś 26 March 2010 в 09:03
  • 2
    Вы можете написать функцию в своем DAO, чтобы сохранить список детей. – Kevin Crowell 26 March 2010 в 15:49
  • 3
    Я не думаю, что это правда. Если вы включите show-sql, вы увидите, что родитель сначала сохраняет – Don Subert 13 April 2018 в 04:56

Основная проблема в test1 () заключается в том, что вы не устанавливаете родительский объект в дочернем объекте. вы должны сказать .. child.setParent (родительский). просто установка дочернего элемента в родительском не означает, что ребенок знает родителя. на самом деле, его ребенок, который владеет отношениями. поэтому необходимо установить родительский объект в дочерний объект. последовательность вызова saveorUpdate () для родителя или дочернего объекта несущественна.

test2 () работает, потому что вы установили родительский элемент в дочерний объект, вызвав child.setParent (). Это отсутствует в test1 ().

0
ответ дан Mayur 16 August 2018 в 02:36
поделиться

У меня есть хорошее решение для этого случая: D

mappedBy означает inverse = "true". поэтому вы должны инвертировать = "false"

попробовать ..

  @OneToMany (fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) // javax.  persistent.CascadeType @JoinColumn (name = "parent_id") // открытый ключ родительского ключа Public & lt; Child & gt;  getChildren () {вернуть детей;  }  

Надеюсь, это будет хорошо работать

4
ответ дан Miigaa 16 August 2018 в 02:36
поделиться
  • 1
    Великий!! после того, как я застрял почти неделю !!!!!. – WRDev 8 February 2018 в 10:47

Прежде чем сохранить родителя, ему не был присвоен идентификатор. Итак, когда вы сначала сохраняете ребенка, у него нет внешнего ключа для сохранения. Вы хотите сделать это, как test2 (), но завершите транзакцию. Посмотрите здесь . Я думаю, что раздел под названием «Демаркация транзакций с EJB / CMT» может быть тем, что вы хотите.

0
ответ дан Rob Heiser 16 August 2018 в 02:36
поделиться
  • 1
    Как я объяснил в комментарии выше, при просмотре журналов спящего режима для test1 () сначала появилась вкладка «Родитель», а затем «Ребенок». Итак, спящий режим должен быть достаточно умным, чтобы определить идентификатор из первой вставки и назначить его второму? – Kamil Łoś 26 March 2010 в 09:08
Другие вопросы по тегам:

Похожие вопросы: