gpt4 book ai didi

java - Hibernate:如何建模继承类型结构并在没有显式转换的情况下执行操作

转载 作者:行者123 更新时间:2023-12-02 13:20:49 24 4
gpt4 key购买 nike

我有一个应用程序,它使用传入消息,解析消息中存在的数据,然后将规则应用于该数据。在规则实体上,有一列用于区分规则的类型

我想将规则的结果保留到单独的表或子类,具体取决于规则类型强> 处理它们。

我目前正在通过创建父 @MappedSuperclass(抽象)BaseResult 对象以及 AppleResultOrangeResult< 来解决此问题/strong> @Enitiy 扩展 BaseResult

我的问题是,鉴于下面的陈述,如何改进/注释模型中的对象,以便在访问/保留每个实例时不必对每个实例进行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 {
//...
}

在父类(super class)上使用@Entity不是问题,因为它无论如何都是抽象..

此外,使用 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
}

关于java - Hibernate:如何建模继承类型结构并在没有显式转换的情况下执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43576499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com