如何使用instanceof

时间:2018-12-28 10:31:36

标签: java hibernate jpa

我有那些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检查,现在我无法重构所有代码。

1 个答案:

答案 0 :(得分:2)

恐怕答案是:开始编写OOP代码。 instanceof面对多态。类的客户应该从不关心他们正在与之交谈的特定子类型/实现。

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

另一方面,如果您出于好奇而使用instanceof,却惊讶地发现它实际上返回了false,请不要担心,您对此实体代理进行的所有调用仍然是多态的。

instanceof之所以失败的原因是,Hibernate需要使用 something 初始化惰性属性,并且无法确定 something 的类型。属性已加载。如果您坚持使用instanceof,则可以尝试启用实体增强功能。