2 回答

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
問(wèn)題不在于JPA,而在于泛型的使用。
首先,更改抽象類(lèi)簽名,使其具有遞歸類(lèi)型:
public abstract class TreeStructure<T extends TreeStructure<T>>
接下來(lái),你不能引用'this',因?yàn)槟悴恢?#39;this'的實(shí)現(xiàn),所以你可以把它強(qiáng)制轉(zhuǎn)換為'T',或者添加一個(gè)帶有類(lèi)似簽名的抽象方法:
public abstract T getImpl();
在實(shí)現(xiàn)中,只需返回“this”。
public T getImpl() {
return this;
}
在側(cè)節(jié)點(diǎn)上,訪(fǎng)問(wèn)類(lèi)中的父類(lèi)實(shí)例變量可能不是一個(gè)好主意。向 TreeStructure 類(lèi)添加一個(gè) addChild 和 removeChild 方法可能是一個(gè)更好的主意。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
我有一個(gè)非常類(lèi)似的場(chǎng)景,我沒(méi)有使用T。相反,我只有抽象類(lèi),因?yàn)槲也恍枰?lèi)型化孩子的靈活性,而且我沒(méi)有演員表。據(jù)我所知(共享代碼),它可能會(huì)讓你接地氣,但我不知道你是否有其他要求。
在我的情況下,另一個(gè)區(qū)別是抽象類(lèi)不是映射的超類(lèi),而是.@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
如果可以提供幫助,您可以在此存儲(chǔ)庫(kù)中找到完整的工作示例
@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<>();
添加回答
舉報(bào)