cit*_*ess 5 tree hibernate jpa-2.0
我有存储在数据库表中的树结构。该表可以存储多棵树。我需要一个查询来返回单个树中的所有节点。我使用以下站点作为资源,但其中的查询会将所有树的所有节点加载到 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>();
}
Run Code Online (Sandbox Code Playgroud)
JPQL 查询:
select distinct n from Node n left join fetch n.children where n.rootId = ROOT_ID
Run Code Online (Sandbox Code Playgroud)
我有虽然问题,我应该创建一个第二个表,以保持在类似于父子关系这篇文章,还是会被罚款,如果我只是使用了自引用表。使用前者似乎需要更多的维护,并且可能需要更复杂的查询。这值得么?我不确定这篇文章解决了什么问题。
我认为在关系数据库中存储递归结构是不自然的。此外,您的问题的答案将取决于您选择为节点和树建模的模式。如果您有一个将父子关系作为外键保存的自引用节点表,则无法通过一个查询来选择属于特定节点的子节点的所有节点。我认为你应该为每棵树都有一个表,并让每个节点引用它的树。然后,您可以简单地选择特定树的所有节点,并通过分析节点来创建树结构。
看看这篇文章:http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases
| 归档时间: |
|
| 查看次数: |
8735 次 |
| 最近记录: |