2011-02-02 2 views
2

У меня есть сообщение, и мне нужно показать десять (например) первых «корневых» ответов со всеми ответами на себя, и это должно выглядеть как дерево. (Знаете, сообщения стандартного сообщения и дерева). Итак, вопрос в том, как получить его из БД - я использую hibernate, а afaik - это много времени - для извлечения самой коллекции WHOLE со всеми поддеревьями рекурсивно. (И, может быть, это хорошо только для небольших коллекций, иначе рекурсия вызовет переполнение стека (Ха-ха. Вот мы :)) Есть ли более эффективное решение?Как показать ответы в виде дерева на сообщение? Java & Hibernate

Так что теперь у меня есть код, как л ниже, но мне нужен еще один способ (BaseEntry это класс как для сообщения и любой ответ):

@Entity public class BaseEntry extends VersionedEntity { 
private @Nullable BaseEntry parent; 

@ManyToOne 
@ForeignKey(name="base_entry_parent__base_entry_fk") 
@Nullable public BaseEntry getParent() 
{ 
    return parent; 
} 

@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY) 
private List<BaseEntry> children; 

... 

Не могли бы вы посоветовать что-нибудь, пожалуйста?

ответ

3

Существует более эффективное решение, но это будет означать полное изменение способа хранения вещей в базе данных. Прочтите http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/, чтобы узнать, как использовать вложенные деревья набора. Этот подход делает записи дорогими, но читает много, намного дешевле. Если вы добавили флаг для корневых узлов, которые вы проиндексировали, то легко получить список корневых узлов, а затем извлечь поддеревья.

Существует существенная модификация, которую я бы предложил к их подходу. Они использовали множество целых чисел без пробелов. Это означает, что каждая запись должна перенумеровать все в дереве. Это делает запись лот дороже. Но предположим, что вы запустили корневые узлы с пробелами 2 ** 20, а каждый ребенок по умолчанию занимает половину доступного для него пространства. Тогда вам не нужно делать какие-либо изменения нумерации, пока не получите набор ответов, равный 21 глубине или ширине. И когда вы перенумеруете, вы можете перенумеровать только поддерево ниже этого корневого узла, потому что у вас все еще есть много пробелов для использования.

+0

спасибо большое .. Я попробую. Но если вы добавите пробел, вы не будете использовать эти lft & rgt для вычисления целого числа ответов на сообщение (?) – javagirl

+0

@javagirl: Правильно, если вы добавите пробел, то количество ответов на сообщение не сразу очевидно. Но я считаю, что вы все равно возвращаете все ответы, поэтому можете просто посчитать их. – btilly

+0

ну, на самом деле я хочу этот номер _before_ Я отвечу ответы :), чтобы показать количество комментариев к сообщению на предыдущей странице – javagirl

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