[英]Hibernate: How to model an Inheritance type structure and do operations without explicit casting
我有一個應用程序,它使用傳入的消息,解析消息中存在的數據,然后將規則應用於該數據。 在“ 規則”實體上,有一列可以區分規則的類型 。
我想將規則的結果保留為單獨的表或子類 ,這取決於處理它們的規則 類型 。
我目前正在通過創建父@MappedSuperclass
(抽象) BaseResult對象以及可擴展 BaseResult的AppleResult和OrangeResult @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.