Java 如何显示对邮件的树状视图回复?爪哇及;冬眠

Java 如何显示对邮件的树状视图回复?爪哇及;冬眠,java,hibernate,collections,treeview,performance,Java,Hibernate,Collections,Treeview,Performance,我有一条消息,需要显示十个(例如)第一个“根”回复,以及对其自身的所有回复,它应该看起来像一棵树。(您知道,标准消息和树回复视图)。 所以,问题是-如何从DB中获取它-我正在使用hibernate,而且可能需要很多时间-递归地检索整个集合本身,以及所有子树。(而且,可能它只适用于小规模的集合,否则递归将导致堆栈溢出(哈哈,我们在这里:)) 有没有更有效的决策 现在我有了下面类似smth的代码,但我需要另一种方法(对于消息和任何回复,BaseEntry都是类): @Entity公共类BaseEnt

我有一条消息,需要显示十个(例如)第一个“根”回复,以及对其自身的所有回复,它应该看起来像一棵树。(您知道,标准消息和树回复视图)。 所以,问题是-如何从DB中获取它-我正在使用hibernate,而且可能需要很多时间-递归地检索整个集合本身,以及所有子树。(而且,可能它只适用于小规模的集合,否则递归将导致堆栈溢出(哈哈,我们在这里:)) 有没有更有效的决策

现在我有了下面类似smth的代码,但我需要另一种方法(对于消息和任何回复,BaseEntry都是类):

@Entity公共类BaseEntry扩展了VersionedEntity{
private@Nullable BaseEntry父级;
@许多酮
@ForeignKey(name=“基本\输入\父项\基本\输入\ fk”)
@可为空的公共BaseEntry getParent()
{
返回父母;
}
@OneToMany(mappedBy=“parent”,cascade=CascadeType.REMOVE,fetch=FetchType.LAZY)
私人名单儿童;
...

您能给点建议吗?

有一个更有效的解决方案,但这意味着完全改变您在数据库中存储内容的方式。阅读以了解如何使用嵌套集树。这种方法使写入成本更高,但读取成本要低得多。如果为已编制索引的根节点添加标志,则很容易o获取根节点列表,然后获取子树


我建议对他们的方法进行重大修改。他们使用了一组完全没有间隙的整数。这意味着每次写操作都必须对树中的所有内容重新编号。这使得写操作的成本更高。但假设您以2**20的间隙开始根节点,并且默认情况下每个子节点占用h如果有足够的可用空间,那么在得到一组深度为21或宽度为21的回复之前,您根本不需要重新编号。当您重新编号时,您可以只重新编号根节点下的子树,因为您仍然有大量的间隙可供使用。

非常感谢。我会尝试。但是,如果您要添加间隙,您将不会使用这些lft&rgt用于计算对邮件的答复总数(?)@javagirl:正确,如果您添加了一个间隔,那么对邮件的回复数量就不是很明显了。但我相信您正在以任何方式获取所有回复,所以您可以只对它们进行计数。事实上,在获取回复之前,我需要这个数字:)来显示对上一条邮件的评论数量page@javagirl:如果你愿意在获取回复之前轻松访问该号码,然后我会将其单独存储在其他地方。是的,它是重复的数据。但出于性能原因,这是一个合理的非规范化处理量。
@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;

...