Слияние и извлечение детей с помощью Hibernate - PullRequest
1 голос
/ 09 декабря 2010

У меня есть модель, которая выглядит так:

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 s, когда я вызываю session.merge(a);?

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

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

1 голос
/ 09 декабря 2010

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

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

Ленивый против не ленивый - это деталь реализации персистентности.Так что все дело в том, "загрузить ли эту вещь как постоянный слой сейчас?"- о том, как оптимизировать постоянный слой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...