гибернация и выборочная ленивая загрузка - PullRequest
0 голосов
/ 19 ноября 2010

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

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

Теперь, когда я возвращаю свой набор результатов из режима гибернации, я подключаю его к 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.

1 Ответ

0 голосов
/ 03 января 2013

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

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

Подробнее об этом можно прочитать Что такое отложенная загрузка в Hibernate? и Объяснения отложенной загрузки .

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

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

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

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

...