2010-12-09 2 views
1

У меня есть модель, которая выглядит следующим образом:Слияние и извлечение детей с использованием Hibernate

A -- Many-toMany --> B -- Many-toMany --> C 

Оба A и B иметь CascadeType из All и FetchType из Lazy.

Когда я делаю следующий вызов:

A mergedA = (A) session.merge(a); 

mergedA имеет коллекцию B объектов разрешенное. B однако не имеет своей коллекции C объектов разрешен.

Если я следующий вызов:

B mergedB = (B) session.merge(b); 

mergedB имеет коллекцию C объектов разрешенное.

Если оба A и B имеют CascadeType из All, почему коллекции C объектов не разрешаются для сбора B х годов, когда я называю session.merge(a);?

+0

Как функция FetchType играет здесь какую-либо роль? – 2010-12-09 03:53:20

+0

Я не думал, что это сыграло бы роль. Я только что отметил это на случай, если кто-то захочет получить дополнительную информацию об аннотациях/атрибутах, которые у меня были. – digiarnie 2010-12-09 04:19:47

ответ

1

Его потому, что он делает это для одного шага глубоко в графе объектов, а C - на втором этапе. Таким образом, это было сделано только для немедленного.

1

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

Переходная настойчивость как концепция применяется к логическим операциям, которые вы хотите «проехать» от родителей к детям. Итак, все о «вы удалили родителя, и должны ли они каскадировать до детей?» - о семантике, которую вы хотите в своих объектных отношениях.

ленивый vs non lazy - это детализация выполнения настойчивости. Так что все о «я как слой настойчивости загружаю эту вещь сейчас?» - о том, как оптимизировать уровень сохранения.

В качестве примечания, Im задается вопросом, является ли это правильное применение слияния. Объединить для повторного подключения отдельного объекта к сеансу, когда объект с тем же идентификатором уже находится в сеансе. Я немного удивлен, что он загружает детей вообще.