Стремитесь получить коллекцию правнуков, используя сеанс без сохранения состояния через NHibernate - PullRequest
3 голосов
/ 22 апреля 2011

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

Критерии выглядят так:

var result = InternalRepository.CreateCritera<Root>()
                .SetResultTransformer(Transformers.DistinctRootEntity)
                .Add(Restrictions.IdEq(id))
                .SetFetchMode("Child", FetchMode.Eager)
                .CreateAlias("Child", "a", JoinType.LeftOuterJoin)
                .SetFetchMode("a.Grandchild", FetchMode.Eager)
                .CreateAlias("Grandchild", "b", JoinType.LeftOuterJoin)
                .SetFetchMode("b.GreatGrandchildCollection", FetchMode.Eager)
                .UniqueResult<Root>();

Когда я выполняю это, TwoPhaseLoad выдает исключение во время InitializeEntity, так как записи сущности контекста персистентности сеанса пусты:

at NHibernate.Engine.TwoPhaseLoad.InitializeEntity(Object entity, Boolean readOnly, ISessionImplementor session, PreLoadEvent preLoadEvent, PostLoadEvent postLoadEvent) in TwoPhaseLoad.cs: line 64
at NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydratedObjects, Object resultSetId, ISessionImplementor session, Boolean readOnly) in Loader.cs: line 603
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in Loader.cs: line 472
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in Loader.cs: line 243
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in Loader.cs: line 1694 
...

Сущность, которую ищет загрузчик, является дочерней сущностью. Почему записи в контексте постоянства здесь пусты? Объект, по-видимому, извлекается (генерируется правильный SQL и возвращает правильные результаты), а объект «Дочерний» создается правильно. Почему неверно состояние строительства объекта? Связано ли это с тем, как сеанс без сохранения состояния использует контекст временного сохранения во время активных загрузок?

1 Ответ

2 голосов
/ 22 апреля 2011

Похоже, что это ограничение в том, как сеанс без состояния управляет контекстом временного постоянства во время двухфазной загрузки.По-видимому, в Hibernate существует исправление, которое не было перенесено в NHibernate.

https://issues.jboss.org/browse/JBPAPP-3737

Обновление :

Да, вышеуказанная проблемабыла проблема и в NHibernate.Я отправил патч здесь: https://nhibernate.jira.com/browse/NH-2669

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