第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

有沒(méi)有一種更清晰的方法可以在Spring JPA中構(gòu)建MappedSuperclass Tree類(lèi)?

有沒(méi)有一種更清晰的方法可以在Spring JPA中構(gòu)建MappedSuperclass Tree類(lèi)?

呼如林 2022-09-07 21:31:33
我目前有幾個(gè)實(shí)體作為樹(shù),需要將它們保存到數(shù)據(jù)庫(kù)。因此,為了不重復(fù)代碼,我構(gòu)建了此類(lèi):@MappedSuperclasspublic abstract class TreeStructure<T extends TreeStructure>{    @ManyToOne(cascade = CascadeType.PERSIST)    private T  parent;    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)    protected Set<T> children = new HashSet<>();    /**     * Function that is used before deleting this entity. It joins this.children to this.parent and viceversa.     */    @Transactional    @PreRemove    public void preDelete()    {        unregisterInParentsChildren();        while (!children.isEmpty())        {            children.iterator().next().setParent(parent);        }    }    public abstract long getId();    protected void setParent(T pParent)    {        unregisterInParentsChildren();        parent = pParent;        registerInParentsChildren();    }    /**     * Register this TreeStructure in the child list of its parent if it's not null.     */    private void registerInParentsChildren()    {        getParent().ifPresent((pParent) -> pParent.children.add(this));    }    /**     * Unregister this TreeStructure in the child list of its parent if it's not null.     */    private void unregisterInParentsChildren()    {        getParent().ifPresent((pParent) -> pParent.children.remove(this));    }    /**     * Move this TreeStructure to an new parent TreeStructure.     *     * @param pNewParent the new parent     */    public void move(final T pNewParent)    {        if (pNewParent == null)        {            throw new IllegalArgumentException("New Parent required");        }        if (!isProperMoveTarget(pNewParent) /* detect circles... */)        {            throw new IllegalArgumentException(String.format("Unable to move Object %1$s to new Object Parent %2$s", getId(), pNewParent.getId()));        }        setParent(pNewParent);    }  所以,最后要說(shuō)的是:有沒(méi)有以更好/更干凈的方式實(shí)現(xiàn)這一點(diǎn)?這個(gè)警告有意義,還是只是Intellij不夠聰明?
查看完整描述

2 回答

?
慕俠2389804

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è)更好的主意。


查看完整回答
反對(duì) 回復(fù) 2022-09-07
?
守著一只汪

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<>();


查看完整回答
反對(duì) 回復(fù) 2022-09-07
  • 2 回答
  • 0 關(guān)注
  • 100 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)