考虑以下情况:我对一个结构使用复合模式,我想从数据库中获取它的根,它实现了一个“级联接口”,级联函数是一个函数,它在顶部执行,但从我的复合树的叶子开始,而幼童总是给出当前的解决方案。leafs以与节点不同的方式实现接口。
@Entity
public class Node implements Cascadable {
@Id
@GeneratedValue
private Long id;
@OneToMany
private List<Cascadable> children;
}显然,这是行不通的,因为我给这个实体和Attribut,这是一个接口和接口不能是一个实体。我可以将接口转换为一个抽象类,利用它创建一个实体,或者使用@ interface或@MappedSuperclass,尽管在这种情况下,我无法用这个树的叶扩展这个新的抽象类,因为它们使用的ID不是生成的。除了我的方法,还有其他选择吗?最优的方法是为子属性使用多个目标实体之类的东西。如果有可能从树的其他部分分离叶,同时仍然使节点知道它包含哪些叶,这将是另一种可能的选择。
问题:在DB中保存一个层次结构,每个节点都需要知道它是稚嫩的,叶子的工作方式与其他节点不同。
(谢谢你的帮助:)
发布于 2018-01-05 10:16:31
有一件事是肯定的:这将永远不适用于接口。多个不相关的实体(每个实体都有一个单独的表)可能实现Cascadable,JPA需要知道要对哪些物理表应用约束。出于同样的原因,不允许多个关联目标。
如果有可能的话,可以把树叶和树的其他部分分开
嗯,解决这个问题的方法是通常的:喜欢组合而不是继承。听起来是桥接模式的一个很好的用例,例如,您可以以“智能”枚举的形式表示要执行的操作。或者,取决于具体的用例,访问者模式也可以工作。
https://stackoverflow.com/questions/48100528
复制相似问题