【问题标题】:How to show tree-view replies to message? Java & Hibernate如何显示对消息的树视图回复? Java 和休眠
【发布时间】:2011-06-20 04:55:12
【问题描述】:

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

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

...

请给点建议好吗?

【问题讨论】:

    标签: java hibernate collections treeview performance


    【解决方案1】:

    有一个更有效的解决方案,但这将意味着彻底改变您在数据库中存储内容的方式。阅读http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 了解如何使用嵌套集合树。这种方法使写入变得昂贵,但读取却便宜得多。如果为已索引的根节点添加标志,则很容易获取根节点列表,然后获取子树。

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

    【讨论】:

    • 非常感谢。我会试试的。但是,如果您要添加一个空白,您将不会使用这些 lft&rgt 来计算对消息的回复总数 (?)
    • @javagirl:正确,如果您添加一个空白,那么对消息的回复数量不会立即明显。但我相信无论如何你都在取回所有的回复,所以你可以数一数。
    • 好吧,其实我想要这个数字之前我会获取回复:) 以显示上一页消息的 cmets 数量
    • @javagirl:如果您想在获取回复之前轻松访问该号码,那么我会将其单独存储在其他地方。是的,它是重复数据。但出于性能原因,进行非规范化是合理的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多