5

我有存储在数据库表中的树结构。该表可以存储多棵树。我需要一个查询,它将返回单个树中的所有节点。我使用以下站点作为资源,但其中的查询会将所有树的所有节点加载到 PersistenceContext 中(不是加载整个表吗?)。我不想这样做,我只想加载一棵树。我如何做到这一点?

我使用 JPA 2 和 Hibernate 作为提供者。

OpenJPA 1.2.x 使用 JPQL
http://www.tikalk.com/java/load-a-tree-with-jpa-and-hibernate#comment-1821选择树结构

[更新] 根据@bennidi 的建议,我想知道我是否可以使用这样的东西:

@Entity
public class Node {

    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "rootId")
    private Node root;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parentId")
    private Node parent;

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @OrderBy("name")
    private List<Node> children = new LinkedList<Node>();
}

JPQL 查询:

select distinct n from Node n left join fetch n.children where n.rootId = ROOT_ID

不过,我确实有一个问题,我是否应该像本文中那样创建第二个表来维护父子关系,或者如果我只使用自引用表就可以了。使用前者似乎需要更多的维护,并且可能需要更复杂的查询。这值得么?我不确定这篇文章解决了什么问题。

4

1 回答 1

0

我认为在关系数据库中存储递归结构是不自然的。此外,您的问题的答案将取决于您选择为节点和树建模的模式。如果您有一个将父子关系作为外键保存的自引用节点表,则无法通过一次查询选择作为特定节点的子节点的所有节点。我认为你应该为每棵树都有一个表,并让每个节点引用它的树。然后您可以简单地选择特定树的所有节点并通过分析节点创建树结构。

看看这篇文章: http: //www.codeproject.com/Articles/8355/Trees-in-SQL-databases

于 2012-04-12T13:32:00.250 回答