【问题标题】:How to render a tree structure in hibernate with multiple tables?如何在具有多个表的休眠中渲染树结构?
【发布时间】:2016-02-11 07:57:47
【问题描述】:
我需要从定义了两个表的数据库中检索树:
在网上我只找到了一个表的例子,即节点一,其中定义了节点和关系:
@Entity
@Table(name = "tree")
public class Node {
@Id
@GeneratedValue
private Integer id;
@NotNull
private String name;
@OneToMany
@JoinColumn(name = "parent_id")
@OrderColumn
private List<Node> children = new LinkedList<Node>();
}
尽管它更简单,但我不太喜欢它,因为基础表没有标准化。
谁能给我一个使用两张表的简单例子?
【问题讨论】:
标签:
java
oracle
hibernate
【解决方案1】:
您可能希望在关系表中有两列,
|标识 | parent_id|
父节点条目将根据节点的 id 更新 parent_id
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name="Relationship", joinColumns = @JoinTable(name = "Relationship", joinColumns = @JoinColumn(name = "parent_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "id", referencedColumnName = "id"))@Fetch(FetchMode.SELECT)
private Node parentNode;
同样,子节点会根据父节点的父 ID 更新 id
节点
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "Relationship", joinColumns = @JoinColumn(name = "id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "parent_id", referencedColumnName = "id"))
@Fetch(FetchMode.SELECT)
private Set<Node> childNodes;
【解决方案2】:
如果我理解正确,您可以创建包含两个 ID 的关系表 - 一个节点 ID,另一个节点 ID - 节点表中此节点的父节点。