簡體   English   中英

Hibernate:如何在不顯式強制轉換的情況下為繼承類型結構建模並執行操作

[英]Hibernate: How to model an Inheritance type structure and do operations without explicit casting

我有一個應用程序,它使用傳入的消息,解析消息中存在的數據,然后將規則應用於該數據。 在“ 規則”實體上,有一列可以區分規則的類型

我想將規則的結果保留為單獨的表或子類 ,這取決於處理它們的規則 類型

我目前正在通過創建父@MappedSuperclass (抽象) BaseResult對象以及可擴展 BaseResultAppleResultOrangeResult @Enitiy來解決此問題

我的問題是,給定以下語句,我該如何在模型中改進/注釋我的對象,以便在訪問/持久化該實例時不必為每個實例執行一次instanceof檢查? 現在,這是我必須采取的措施,以避免“ baseresult不存在” SQL語法異常:

public void save(BaseResult baseResult) {
    if (baseResult instanceof AppleResult) {
        jpaApi.em().merge((AppleResult) baseResult);
    } else if (baseResult instanceof OrangeResult) {
        jpaApi.em().merge((OrangeResult) baseResult);
    }
}

我希望有一個比必須執行if / else並根據結果顯式強制轉換的更優雅的解決方案。 我一直在尋找使用@DiscriminatorValue注釋之類的使用泛型的東西,但是這些似乎都要求在我的情況下, BaseResult也是一個實體,不是。

您應該使用@Inheritance 然后,保存將非常簡單:

public void save(final BaseResult baseResult) {
    jpaApi.em().merge(baseResult);
}

使用哪種繼承策略取決於您當前的數據庫設計,但是我猜測您為每個子類都有一個表,因此如下所示:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseResult {
    //...
}

@Entity
public class AppleResult extends BaseResult {
    //...
} 

在超類上具有@Entity並不是問題,因為無論如何它都是abstract

同樣,使用merge通常是不應該做的事情,您應該只在事務中操作實體,並在提交事務后將其自動持久保存在數據庫中:

@Transactional //either this...
public void doStuff(final ResultCommand command) {
    //begin transaction <-- ...or this
    final BaseResult result = em.find(BaseResult.class, command.getResultId());
    result.apply(command);
    //end transaction
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM