具有JPA的复合模式实体

时间:2018-01-04 17:28:32

标签: java hibernate jpa spring-data-jpa composite

考虑以下情况: 我正在使用一个结构的复合模式,我想从数据库的root中获取并实现一个“级联接口”,cascade函数是一个在顶部执行但从我的复合的叶子开始的函数树,而childreen总是给父母当前的解决方案。叶子以与节点不同的方式实现接口。

@Entity
public class Node implements Cascadable {

  @Id
  @GeneratedValue
  private Long id;

  @OneToMany
  private List<Cascadable> children;
}

显然,这不起作用,因为我给这个Entity和Attribut这是一个接口而接口不能是一个实体。我可以将接口转换为抽象类,从中创建一个实体,并使用@Inheritance或@MappedSuperclass,尽管在这种情况下,我无法使用此树的叶子扩展这个新的抽象类,因为他们使用的是未生成的ID。我的方法有其他选择吗?最佳可能就像使用子属性的多个目标性或类似的东西。如果以某种方式可以将树叶与树的其余部分分开,同时仍然使节点知道它包含哪些叶子,这将是另一种可能的替代方案。

问题:在数据库中保存层次结构,每个节点都需要知道它的子绿色,叶子的工作方式与其他节点不同。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

有一件事是肯定的:这将无法使用接口。多个不相关的实体(每个实体都有一个单独的表)可以实现Cascadable,JPA需要知道要应用约束的物理表。出于同样的原因,不允许多个关联目标。

  

如果以某种方式可以将树叶与树的其余部分分开

嗯,这个问题的解决方案通常是:赞成合成而不是继承。听起来像 bridge 模式的一个很好的用例,你可以用一个“智能”的形式表示要执行的动作。例如,枚举。或者,根据确切的用例, visitor 模式也可以正常工作。

相关问题