Intellij 调试器单步跳过 hibernate 对象值为空

Rob*_*_UK 5 java debugging spring hibernate intellij-idea

当我使用 Intellij 跨过休眠对象时,对象在调试窗口中显示为空。标记为$$_hibernate_interceptor

假设我有一些简单的代码,如下所示

Subscription subscription  = subscriptionRepository.getOne(1l);
log.info("add breakpoint debug code stopped here")
Run Code Online (Sandbox Code Playgroud)

我想查看从 subscriptionRepository 返回哪些值并分配给窗口内的订阅对象Debug:

请参阅屏幕截图,显示它在我的计算机上的样子。

在此输入图像描述

正如您所看到的,大多数变量值似乎都是空的,但是如果我对订阅对象执行 toString() ,它将输出在拦截器窗口中标记为 null 的值。所以它们并不是真正空的。

这里有几个问题

  • 什么是$$_hibernate_interceptor

进一步的发现

仅当我使用默认值时才返回拦截器repository.getOne。如果我使用 findBy 或我自己的 findByField,它不会调用拦截器并在调试窗口中显示值。

这里发生了什么,为什么 getOne 显示拦截器而其他的不显示?

cfs*_*ras 4

如您所见,您的订阅类型是Subscription$HibernateProxy$...。这是因为 Hibernate 在您使用属性时从数据库延迟加载它们。

在第一次访问它们之前,例如在 a 中toString(),它们将为 null。您可以通过在“subscription.toString()”上添加变量监视(小+图标)来轻松回避这个问题。

findById和的区别getOne在于,前者返回一个惰性代理,而后者使用一个急切加载的对象。有关原因的一些信息可以在此处找到