如何使用 JPA 填充闭包表?

Apo*_*psa 5 java sql-server jpa

我正在尝试对数据库中的对象层次结构(实际上是域组)进行建模。我决定使用闭包表,这样我就可以在查询层次结构时获得高度灵活性。基本上,我的架构看起来像这样:

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

CREATE TABLE groupHierarchy (
    idAncestor INT,
    idGroup INT,
    hierarchyLevel INT
)
Run Code Online (Sandbox Code Playgroud)

因此,当 id 为 1 的组包含 id 为 2 的组,而该组又包含 id 为 3 的组时,我需要在 groupHierarchy 表中包含以下行。

idAncestor  idGroup  hierarchyLevel
1           1             0
2           2             0
3           3             0
1           2             1
2           3             1
1           3             2
Run Code Online (Sandbox Code Playgroud)

我也可以接受没有 hierarchyLevels 为 0 的行(自引用)。

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

我已经考虑的是:

1)将组层次结构映射为元素集合,例如:

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

这需要完全在应用程序中处理层次结构,而且恐怕这可能会变得非常复杂。

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

谁能建议其他选择?或者指出我提到的解决方案的优点或缺点?

小智 3

我可以建议您使用JpaTreeDao吗?我认为它是完整的并且有很好的记录。我将尝试将闭包表代码移植到常规实现中......