我有那些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
。这是因为我有休眠代理。当我换成EAGER时,我没有这个问题。但我不想放EAGER,因为EAGER遇到性能问题。
您知道如何解决此问题吗?
PS。我知道instanceOf检查是不好的做法,我只需要维护旧的代码,其中有很多instanceOf检查,现在我无法重构所有代码。
答案 0 :(得分:2)
恐怕答案是:开始编写OOP代码。 instanceof
面对多态。类的客户应该从不关心他们正在与之交谈的特定子类型/实现。
如果您使用实体继承,现在需要在代码中使用instanceof
,则设计很可能存在缺陷。 Hibernate在很多情况下都使用代理,因此您不能依赖instanceof
或.getClass()
总是返回实体的确切类。
另一方面,如果您出于好奇而使用instanceof
,却惊讶地发现它实际上返回了false
,请不要担心,您对此实体代理进行的所有调用仍然是多态的。
instanceof
之所以失败的原因是,Hibernate需要使用 something 初始化惰性属性,并且无法确定 something 的类型。属性已加载。如果您坚持使用instanceof
,则可以尝试启用实体增强功能。