2015-02-17 70 views
1

我想模拟一个数据库中的对象(实际上,域组)的层次结构。我决定使用闭包表,这样我可以在查询层次结构时获得高度的灵活性。基本上,我的架构看起来是这样的:如何使用JPA填充封闭表?

CREATE TABLE group (
    id INT -- primary key 
    ... -- other fields here 
) 

CREATE TABLE groupHierarchy (
    idAncestor INT, 
    idGroup INT, 
    hierarchyLevel INT 
) 

所以,当为1的ID一组包含为2的ID,又包含有3的ID一组一组的,我需要在groupHierarchy表中具有以下行。

idAncestor idGroup hierarchyLevel 
1   1    0 
2   2    0 
3   3    0 
1   2    1 
2   3    1 
1   3    2 

我也没有与hierarchyLevels 0(自我参考)的行。

现在我想有一个映射到组表的JPA实体。我的问题是 - 什么是管理groupHierarchy表的好方法?

我已经被认为是:

1)具有映射为一个元素集合组层次,如:

@ElementCollection 
@JoinTable(name = "groupHierarchy") 
@MapKeyJoinColumn(name = "idAncestor") 
@Column(name = "hierarchyLevel") 
Map<Group, Integer> ancestors; 

这需要完全处理应用程序中的层级,恐怕这可能会变得非常复杂。

2)使应用程序不知道hierarchyLevel列并使用触发器在数据库中处理它(添加记录时,检查父代是否已经有祖先,如果是,则添加其他所需的行。 0的hierarchyLevel将派上用场)。在我看来,数据库触发器会更简单,但我不确定这对整体可读性是否有利。

任何人都可以建议其他选项吗?或者可以指出我提到的解决方案的优点或缺点?

回答

1

我可以告诉你使用JpaTreeDao?我认为这是完整的,并有很好的文件记录。我将尝试将闭合表代码移植到groovy实现中...