2010-11-19 4 views
0

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

a 
-b 
--c 
-d 
--e 
---f 
---g 

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

Теперь, чтобы сделать его еще хуже, есть транзакции, в которых я хочу иметь все записи класса a, b, c, d, но ни один из e, f, g. но следующий запрос может захотеть всех a, d, e, f, g и ни одного из b, или c и следующего запроса всех a, d, g и ни одного остального.

так, мой класс DAO выглядит следующим образом

public class SurveyNameDAO extends HibernateDaoSupport 
{ 
public List<SurveyName> getPermittedSurveys(String userName) 
    { 
     StringBuffer sql = new StringBuffer(); 
     sql.append("select distinct sn "); 
     sql.append("from SurveyName as sn, SurveyNameStore name_store "); 
     sql.append("where name_store.showStoreLocation.storeName in (select ng.pnName "); 
     sql.append("from NukeGroups as ng, NukeUsers as nu "); 
     sql.append("where nu.pnName = '" + userName + "')"); 

     SurveyName loc = null; 
     List l = getHibernateTemplate().find(sql.toString()); 

     return l; 

    } 
} 

Основной вопрос состоит в том, как я могу изменить этот метод (и многие, как это), где я могу добавить какое-то индикаторы говорит, чтобы загрузить возвратный класс в как я говорил выше, а затем полностью отключиться от спящего режима и забыть о ленивой загрузке, когда я отправляю ее в jibx.

+0

Рекомендовать замену переменных в вашем запросе на a, b, c, ...как на диаграмме выше, поэтому мы можем понять, как отношения связаны с запросом. Кроме этого, это немного больше SQL, чем я делаю на регулярной основе, поэтому я не знаю, что я мог бы помочь без каких-либо дополнительных усилий, чем практический =) – stevendesu

+0

его не проблема с запросом HQL, его нужно сделать с указанием спящего режима, как загрузить результат в свои классы. – scphantm

ответ

0

По умолчанию hibernate загружает дочерние объекты. Это означает, что будет загружен только запрошенный объект, т. Е. В вашем примере будет загружен объект SurveyName.

Предполагая SurveyName соответствует сущности в дереве вы показано выше, только корочки B и D, которые являются непосредственно привязанные объекты в A будет загружен.

Вы можете узнать больше об этом What is lazy loading in Hibernate? и Explanations of lazy loading.

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

После этого, вы можете передать SurveyName объект и SurveyNameStore ссылка будет доступна для отправки клиенту.

Аналогичным образом вы загружаете все объекты, которые вам нужны, в каждом методе отдельно.

У меня нет структуры классов, поэтому я не могу дать точное решение, но работа над этими линиями должна решить вашу проблему, если вы ее еще не решили.

+0

теперь не имеет значения. Я убедил клиента бросить спячку на улицу и переписать заявку в прямом JDBC. уже в обновленных модулях мы увидели, что количество ошибок падает до той части, с которой мы сталкивались раньше. я никогда не буду использовать спящий режим снова, jdbc намного проще. – scphantm

+0

в моем опыте, спящий режим сделал простой материал очень простым, но пользовательские/сложные требования или граничные случаи делают вещи весьма проблематичными. Хороший звонок! –

Смежные вопросы