SimpleNaturalIdLoadAccess' load 方法返回一个 HibernateProxy



是我误解了load的文档,还是特别是loadOptional,其中指出:

load方法javadoc:

返回具有给定自然id值的持久实例,或者如果没有这样的持久实例,则为null。如果实例是已经与会话关联的实例返回该实例,如果需要,初始化它。此方法从不返回未初始化的例子Params:naturalIdValue–要检索的实体返回:持久实例或空

加载可选的:

与load的语义相同,只是此处返回Optional以处理可空性。

我希望这个方法永远不会返回未初始化的实例,这意味着我永远不会取回Hibernate代理实例-但事实上,当我查看调试器时,我确实这样做了,这反过来会导致ClassCastException,并显示以下消息:

ExportBatch$Hibernate Proxy$h16E0GPh不能强制转换为类DkEkapitalExportBatch

因为getReference方法的javadoc记录如下,它只会进一步增加我的困惑:

此方法可能返回已初始化的代理实例按需

JPA中有一件事要求在整个托管生命周期中为持久实体保留对象标识。这可能就是让你困惑的地方。如果您有一个已与当前持久性上下文关联的持久性实体的代理,您将始终收到此代理对象,但基础实体将被初始化。因此,对实体的方法的任何调用都将在没有额外数据库访问的情况下成功。如果您想要底层对象,则需要使用org.hibernate.Hibernate#unproxy(java.lang.Object)缩小对象范围

最新更新