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

Java 如何使用instanceof解决JPA延迟加载问题,java,hibernate,jpa,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 =

我有那些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
然后像这样检查实例

t、 getAddress()instanceOf ConsolidationHub返回
false
。这是因为我得到了hibernate代理。当我变为渴望时,我没有这个问题。但我不想把渴望,因为我有与渴望的性能问题

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


另外,我知道instanceOf-check是一种不好的做法,我只需要维护旧代码,其中有很多instanceOf-check,我现在无法重构它们

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

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

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


instanceof
在这里失败的原因是Hibernate需要用某个东西初始化惰性属性,并且在加载该属性之前,它无法确定该东西的类型。如果您坚持使用
instanceof
,您可以尝试启用实体增强

对不起,我不知道如何在hibernate中工作。但你真的解决了这个问题吗。为什么不解决性能问题呢?当我使用“渴望”时,我遇到了性能问题,解决性能问题的一种方法是将其改为“懒惰”,并使用join fetch编写JPA查询(但在这种情况下,我遇到了instanceOf的问题)。那么你还有其他建议吗?谢谢@Jocke@user1321466,尝试使用延迟加载的t.getAddress().isAssignableFrom(ConsolidationHub.class)进行加载。“instanceof”在Java中是一个非常有效的操作。其他JPA提供商不会把这强加给你。PS您拼写“Abstract”错误它可能不适用于您的情况,我也没有真正尝试过它,但可以使用类型运算符预先限制查询获取的地址类型(请参阅JPA 2.1规范中的第4.6.17.5节)。例如:
从传输中选择t左连接获取t地址a,其中类型(a)=“ConsolidationHub”
。我不确定它是否真的适用于人际关系。