Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Ссылка Entity на саму себя в Hibernate3 (EJB3)


Автор: sandello 13.10.2005, 13:17
Есть необходимость представить дерево в виде Entity. Если я правильно понимаю, будет создана таблица со ссылкой на саму себя.
Как это грамотно реализовать в виде Entity? Главную проблему вижу в том, что при попытке получить корень из базы будет рекурсивно загружено все дерево целиком. Нужно (как правило) только текущий узел и его следующее поколение.

Решение практической задачи вижу двумя путями:
1. в лоб: реализовать Entity "узел дерева" и работать с ним
2. не пользоваться вообще Entity. Реализовать класс, содержащий узел и его следующиее поколение, написать загрузчик для него.

Автор: tux 13.10.2005, 16:16
Думаю можно смело реализовывать entity EJB, представляющий узел дерева. Благодаря тому, что при обращении к атрибутам entity EJB реально вызываются не методы этого объекта, а методы объекта-заглушки, производитель контейнера EJB имеет возможность реализовать любой алгоритм оптимизации загрузки данных, так как до вызова реального объекта можно выполнить любой код, связанный в том числе и с загрузкой/выгрузкой данных.

Более того, спецификация EJB также говорит о том, что производитель вправе оптимизировать загрузку и выгрузку данных (JSR 220: Enterprise JavaBeans, Version 3.0, раздел 8.4.2.1). Чаще всего разработчики серверов приложений пользуются такой возможностью и реализуют так называемую загрузку по требованию (lazy loading), то есть какой-то реальный объект появляется в атрибуте только после вызова метода.

Таким образом, все дерево целиком рекурсивно загружено скорее всего не будет, хотя зависит все от контейнера. Однако, наверняка большинство разработчиков такой возможностью не пренебрегает.

Автор: sandello 14.10.2005, 05:58
Я не хочу использовать в этом месте Lazy loading. Ибо нужно быстро вытащить данные из базы и передать наружу из AS.
Если использовать lazy, придется находить нужный entity, циклом пробежаться по его непосредственным потомкам и только после этого выдавать его наружу, предварительно отломав от entityManager'а.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)