我有消息,需要显示十个(例如)第一个“根”回复以及对其自身的所有回复,并且它应该看起来像一棵树。 (标准消息和树状回复视图,你知道)。
所以,问题是 - 如何从数据库获取它 - 我正在使用休眠,据我所知,它将需要很多时间 - 递归地检索整个集合本身以及所有子树。 (而且,也许它只适用于小型集合,否则递归会导致堆栈溢出(哈哈。我们在这里:))
有没有更有效的决策?
所以现在我有类似下面的代码,但我需要另一种方法(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;
...
请你给我一些建议好吗?
有一个更有效的解决方案,但这意味着彻底改变数据库中存储内容的方式。读http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/学习如何使用嵌套集树。这种方法使得写入成本高昂,但读取成本却低得多。如果您为已索引的根节点添加标志,则可以轻松获取根节点列表,然后获取子树。
我建议对他们的方法进行重大修改。他们使用完全没有间隙的整数集。这意味着每次写入都必须对树中的所有内容重新编号。这使得写一个lot更贵。但假设您以 2**20 的间隙开始根节点,并且默认情况下让每个子节点占用其可用空间的一半。然后,您无需进行任何重新编号,直到获得一组深度或宽度为 21 的回复为止。当您重新编号时,您可以仅对根节点下方的子树进行重新编号,因为您仍然有足够的间隙可以使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)