Как да стартирате заявка за Nhibernate ICriteria с setFetchMode(Lazy), когато lazy=false е дефиниран в HBM?

Бих искал да стартирам критериална заявка с мързеливи асоциации много към едно. Тези асоциации са зададени като lazy="false" в HBM. Това е така, защото го използваме с нетърпение 90% от проекта.

Но има няколко „големи“ заявки, които трябва да се изпълняват като lazy="proxy".

HBM:

<many-to-one name="DestinationElement" class="X" column="DstElemId" not-null="true" unique="false" cascade="save-update" outer-join="auto" fetch="select" lazy="false" index="IDX_Ass_DestElem">

Настройка на критериите:

criteria.SetFetchMode("DestinationElement", FetchMode.Lazy);

Работи обратното, но не и по този начин. Извлича се с нетърпение.

LOC е 20K+ и би било огромен рефактор да се направи обратното.

Как мога да накарам това да се извлича лениво само когато искам, и да извлича нетърпеливо през цялото време?

Благодаря предварително!


person user461828    schedule 29.09.2010    source източник


Отговори (1)


lazy="false" в HBM не може да бъде заменено в заявка (освен че е лоша идея в 99% от случаите)

Ще трябва да промените кода си.

person Diego Mijelshon    schedule 30.09.2010
comment
Благодаря. Междувременно разбрах, че няма как да стане. И така, ще променим кода. - person user461828; 30.09.2010
comment
Би било добре да имаме тази опция, но както знаех, беше проблем с дизайна, защо използвахме някои асоциации с нетърпение. Това беше, защото се нуждаехме от нетърпеливо извлеченото свойство като реален обект: трябваше да направим преобразуване, но то беше извлечено като родител на реалния обект, така че преобразуването не беше възможно. напр. Имаме пациент, който има свойство Терапевт, който е личност. Всъщност този човек винаги е Доктор, който е наследен от Лице. Така че, когато извличам човек лениво, не мога да го хвърля към Доктор, защото е достъпна само частта за човек. Това беше поради наличието на грешни методи „Equals“. - person user461828; 30.09.2010
comment
Така че, приемайки терапевта лениво като човек, не може да бъде прехвърлен на доктор. Но ако настроим свойството да го извлича нетърпеливо, това Е доктор. Затова го използвахме така. Но когато се извличат множество пациенти, се извличат и всички лекари. В този случай става много бавно. Знам, че може да се присъедини, но по този начин размерът на заявката става 100K+ и Oracle не може да се справи с това. И така, това беше сложна ситуация, в която беше необходимо незабавно бързо и мръсно решение. Но както знаем, qad решенията винаги получават обратен удар:D - person user461828; 30.09.2010
comment
Писал съм за това как да разреша този проблем тук: sessionfactory. blogspot.com/2010/08/ - person Diego Mijelshon; 30.09.2010
comment
Много хубаво решение!!! Ще трябва да го пробвам :) Намерих UnProxy и реших да го използвам, но ще опитам и това. Надявам се, че ще бъде последователен, защото открих много странно поведение на NH кеша. - person user461828; 30.09.2010