如何使用多个表在hibernate中呈现树结构?

时间:2016-02-11 07:57:47

标签: java oracle hibernate

我需要从DB中检索一棵树,其中我定义了两个表:

  • 节点这里我定义了一个节点元素

  • 关系这里我通过指定使用ID的父母和孩子来定义树结构

在互联网上查看我只找到一个包含单个表的示例,即节点1,其中定义了节点和关系:

@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>();

}

即使它更简单,我也不太喜欢它,因为基础表没有规范化。

任何人都可以使用两张桌子给我一个简单的例子吗?

2 个答案:

答案 0 :(得分:1)

您可能希望在关系表中有两列

  

| id | 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;
  

类似地,子节点将针对的parent_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;

答案 1 :(得分:0)

如果我正确理解你可以创建包含两个ID的关系表 - 一个节点ID,另一个节点ID - Nodes表中该节点的父节点。