如何显示对消息的树视图回复? Java&过冬

时间:2011-02-02 19:05:43

标签: java hibernate collections treeview performance

我有消息,并且需要显示十个(例如)第一个“root”回复以及对其自身的所有回复,它应该看起来像一棵树。 (标准消息和树回复视图,你知道)。 所以,问题是 - 如何从数据库中获取它 - 我正在使用hibernate,并且afaik将花费大量时间 - 以递归方式检索所有子树的WHOLE集合本身。 (而且,也许,它仅适用于小型集合,否则递归会导致堆栈溢出(哈哈哈。我们在这里:) 有更有效的决定吗?

所以现在我有类似下面的代码,但我需要另一种方式(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;

...

请问一些建议吗?

1 个答案:

答案 0 :(得分:3)

有一个更有效的解决方案,但它将意味着完全改变您在数据库中存储内容的方式。阅读http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/以了解如何使用嵌套集树。这种方法使写入成本高昂,但阅读量大得多,便宜得多。如果为已编制索引的根节点添加标记,则可以轻松获取根节点列表,然后获取子树。

我建议对他们的方法进行重大修改。他们使用了整数组,没有任何间隙。这意味着每次写入都必须重新编号树中的所有内容。这使写入批次更加昂贵。但是假设您以2 ** 20的间隙启动根节点,并且默认情况下让每个子节点占用可用空间的一半。然后,在您有一组21或更深的回复之前,您根本不需要进行任何重新编号。当你重新编号时,你可以只重新编号该根节点下面的子树,因为你仍然有很多空隙可供使用。