2 回答
TA贡献1719条经验 获得超6个赞
问题不在于JPA,而在于泛型的使用。
首先,更改抽象类签名,使其具有递归类型:
public abstract class TreeStructure<T extends TreeStructure<T>>
接下来,你不能引用'this',因为你不知道'this'的实现,所以你可以把它强制转换为'T',或者添加一个带有类似签名的抽象方法:
public abstract T getImpl();
在实现中,只需返回“this”。
public T getImpl() {
return this;
}
在侧节点上,访问类中的父类实例变量可能不是一个好主意。向 TreeStructure 类添加一个 addChild 和 removeChild 方法可能是一个更好的主意。
TA贡献1872条经验 获得超4个赞
我有一个非常类似的场景,我没有使用T。相反,我只有抽象类,因为我不需要类型化孩子的灵活性,而且我没有演员表。据我所知(共享代码),它可能会让你接地气,但我不知道你是否有其他要求。
在我的情况下,另一个区别是抽象类不是映射的超类,而是.@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
如果可以提供帮助,您可以在此存储库中找到完整的工作示例
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class TreeStructure {
...
@ManyToOne(cascade = CascadeType.PERSIST)
private TreeStructure parent;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
protected Set<TreeStructure> children = new HashSet<>();
添加回答
举报
