Двунаправленные дубликаты «один ко многим» в режиме гибернации - PullRequest
2 голосов
/ 30 июля 2010

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

Вот отображения гибернации:

    <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 здесь говорит, что двунаправленные отношения должны работать таким образом.Чего мне не хватает?

1 Ответ

1 голос
/ 30 июля 2010

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

...