| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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'а. |