Спящий режим и удаление из списков - PullRequest
0 голосов
/ 12 января 2012

У меня есть два класса, ProductConfiguration и SubProduct.

Я хочу заменить субпродукты в конфигурации, что я делаю следующим образом:

productConfiguration.getSubProducts().clear();
productConfiguration.getSubProducts().addAll(newSubProducts);

При этом Hibernate пытается установить для идентификатора родителя (конфигурации продукта) значение NULL, а затем обновить строку в базе данных. Это терпит неудачу, так как родительский идентификатор является внешним ключом, и, следовательно, не обнуляется.

Отображение из ProductConfiguration на SubProduct:

<bag name="subProducts"
     table="sub_product"
     cascade="all-delete-orphan"
     access="field"
     lazy="false">
    <key column="parent_id"/>
    <one-to-many class="com.conscius.cpt.core.product.SubProduct"/>
</bag>

<many-to-one name="parentProduct"
             class="com.conscius.cpt.core.product.ProductConfiguration"
             column="parent_id"
             access="field"
             not-null="true"
             cascade="none"/>

Ответы [ 2 ]

1 голос
/ 12 января 2012

если внешний ключ не имеет значения null, вы, вероятно, захотите удалить субпродукты, у которых нет родителя:

<bag name="subProducts" cascade="all-delete-orphan" ...

Обновление: чтобы предотвратить обновления внешнего ключа, вы можете сделать

<bag name="subProducts" inverse="true" ...

// and
for (SubProduct sub : productConfiguration.getSubProducts())
{
    sub.setParentProduct(null);
}
productConfiguration.getSubProducts().clear();
productConfiguration.getSubProducts().addAll(newSubProducts);
0 голосов
/ 13 января 2012

Решение здесь простое.Я забыл добавить обратное утверждение на стороне конфигурации продукта.

<bag name="subProducts"
     table="sub_product"
     cascade="all-delete-orphan"
     access="field"
     lazy="false">
    <key column="parent_id"/>
    <one-to-many class="com.conscius.cpt.core.product.SubProduct"/>
</bag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...