gpt4 book ai didi

java - 如何使用 instanceof 解决 JPA 延迟加载问题

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:42 24 4
gpt4 key购买 nike

我有那些 jpa 实体

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
class AbstarctAddress {


}

@Entity
public class ConsolidationHub extends AbstarctAddress {

}


@Entity
class Transport {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "delivery_address_id")
private AbstarctAddress address;

}

当我在做的时候

select t from Transport t left join fetch t.address

然后像这样检查instanceof

t.getAddress() instanceOf ConsolidationHub 它返回 false 。这是因为我有 hibernate 代理。当我更改为 EAGER 时,我没有那个问题。但我不想放 EAGER,因为 EAGER 有性能问题。

你知道如何解决这个问题吗?

附言。我知道 instanceOf 检查是不好的做法,我只需要维护旧代码,其中有很多 instanceOf 检查,我现在不能重构所有这些。

最佳答案

恐怕答案是:开始编写 OOP 代码。 instanceof 与多态性背道而驰。一个类的客户应该从不关心他们正在与哪个特定的子类型/实现对话。

如果您使用了实体继承,现在需要在您的代码中使用 instanceof,那么您的设计很可能存在缺陷。 Hibernate 在许多情况下使用代理,您不能依赖 instanceof.getClass() 总是返回实体的确切类。

另一方面,如果您出于好奇使用了 instanceof,并且惊讶地发现它实际上返回了 false,请不要害怕,all calls you使这个实体代理仍然是多态的。

这里instanceof失败的原因是Hibernate需要用something来初始化惰性属性,而它无法确定那个something的类型> 直到加载属性。如果您坚持使用instanceof,您可以尝试启用实体增强。

关于java - 如何使用 instanceof 解决 JPA 延迟加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957073/

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