2010-07-30 6 views
2

У меня возникли проблемы с отношениями родитель-ребенок. Когда я упорствую со стороны коллекции (дочерняя сторона), я получаю 2 новых детей вместо одного.hibernate двунаправленные одноразовые вставки дубликатов

Здесь есть являются Hibernate отображения:

<set name="children" inverse="true" 
     cascade="all,delete-orphan" lazy="true" 
     order-by="CHILD_ID desc"> 
     <key column="PARENT_ID" /> 
     <one-to-many class="com.mycompany.Child" /> 
    </set> 
    <many-to-one name="parent" class="com.mycompany.Parent" not-null="true"> 
     <column name="PARENT_ID" /> 
    </many-to-one> 

Вот код Java используется для добавления ребенка в двунаправленной связи:

// Persist logic... 
Parent p = myParentService.findById(1); 
Child c = new Child(); 
p.addChild(c); 
myChildService.persist(child); 

// Inside the parent class... 
public void addChild(Child child) 
{ 
    if (this.children == null) 
     this.children = new LinkedHashSet<Child>(); 

    this.children.add(child); 
    child.setParent(this); 
} 

Если я удалить «this.children.add (ребенок);» часть работает так, как ожидалось. Это сбивает с толку, потому что документ Hibernate here говорит, что двунаправленные отношения должны работать таким образом. Что мне не хватает?

+0

is setParent также добавляет ребенка? –

+0

Нет, setParent просто выполняет простое назначение. – user333903

+0

Способ управления двунаправленной ассоциацией является правильным, вам нужно установить обе стороны ссылки. Но что вы имеете в виду именно * Я получаю 2 новых детей *? Где? В базе данных? В сборнике? И то и другое? Как вы реализовали 'equals' /' hashCode'? Используете ли вы 'id' в своей реализации? Вы действительно можете это показать? –

ответ

1

Включенный каскад сохраняется в коллекции родителя, поэтому нет необходимости вызывать упорство на дочернем объекте. Если родительский элемент находится в управляемом состоянии, новый ребенок будет сохранен в следующий раз, когда транзакция совершит/произойдет синхронизация. Каскад не включен в примерную документацию, которую вы связали.

+0

Вы говорите, что каскадный стиль вызывает дубликат дочерней записи? – user333903

+0

@caleb Включение каскадирования не должно вызывать записи дубликатов. –

Смежные вопросы