我有一个存储在数据库表中的树结构。该表可以存储多个树。我需要一个返回单树中所有节点的查询。我已经使用以下站点作为资源,但是其中的查询会将所有树的所有节点加载到PersistenceContext(不是加载整个表吗?)。我不想这样做,我只想加载一棵树。我该如何实现?
我使用JPA 2和Hibernate作为提供者。
OpenJPA 1.2.x select tree structure using 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
我确实有一个问题,我是否应该创建第二个表以保持像this article中的父子关系,或者如果我只使用自引用表就可以了。与前者配合似乎需要更多的维护,可能需要更复杂的查询。这值得么?我不确定该文章正在解决哪些问题。
答案 0 :(得分:0)
我认为在关系数据库中存储递归结构是不自然的。您的问题的答案还取决于您选择的模式节点和树的模式。如果您具有将父子关系保存为外键的自引用节点表,则无法通过一个查询选择作为特定节点的子节点的所有节点。我认为你应该有一个每个树的表,并让每个节点引用它的树。然后,您只需选择特定树的所有节点,并通过分析节点来创建树结构。
看一下这篇文章:http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases