我想模拟一个数据库中的对象(实际上,域组)的层次结构。我决定使用闭包表,这样我可以在查询层次结构时获得高度的灵活性。基本上,我的架构看起来是这样的:如何使用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将派上用场)。在我看来,数据库触发器会更简单,但我不确定这对整体可读性是否有利。
任何人都可以建议其他选项吗?或者可以指出我提到的解决方案的优点或缺点?