考虑以下情况: 我正在使用一个结构的复合模式,我想从数据库的root中获取并实现一个“级联接口”,cascade函数是一个在顶部执行但从我的复合的叶子开始的函数树,而childreen总是给父母当前的解决方案。叶子以与节点不同的方式实现接口。
@Entity
public class Node implements Cascadable {
@Id
@GeneratedValue
private Long id;
@OneToMany
private List<Cascadable> children;
}
显然,这不起作用,因为我给这个Entity和Attribut这是一个接口而接口不能是一个实体。我可以将接口转换为抽象类,从中创建一个实体,并使用@Inheritance或@MappedSuperclass,尽管在这种情况下,我无法使用此树的叶子扩展这个新的抽象类,因为他们使用的是未生成的ID。我的方法有其他选择吗?最佳可能就像使用子属性的多个目标性或类似的东西。如果以某种方式可以将树叶与树的其余部分分开,同时仍然使节点知道它包含哪些叶子,这将是另一种可能的替代方案。
问题:在数据库中保存层次结构,每个节点都需要知道它的子绿色,叶子的工作方式与其他节点不同。
感谢您的帮助:)
答案 0 :(得分:0)
有一件事是肯定的:这将无法使用接口。多个不相关的实体(每个实体都有一个单独的表)可以实现Cascadable
,JPA需要知道要应用约束的物理表。出于同样的原因,不允许多个关联目标。
如果以某种方式可以将树叶与树的其余部分分开
嗯,这个问题的解决方案通常是:赞成合成而不是继承。听起来像 bridge 模式的一个很好的用例,你可以用一个“智能”的形式表示要执行的动作。例如,枚举。或者,根据确切的用例, visitor 模式也可以正常工作。