当前位置: 首页 > 知识库问答 >
问题:

Intellij调试器单步执行hibernate对象值为空

夔波
2023-03-14

当im使用Intellij步进hibnerate对象时,该对象在调试窗口中显示为null。标记为$$_hibernate_interceptor

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

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

我希望查看从subscriptionRepository返回并分配给Debug:窗口中的订阅对象的值。

查看屏幕截图,显示了这在我的计算机上的样子。

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

这里有几个问题

  • 什么是$$_hibernate_interceptor

进一步的调查结果

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

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

共有1个答案

汪正卿
2023-03-14

可以看到,订阅的类型是Subscription$HibernateProxy$...。这是因为Hibernate在使用属性时会从数据库中延迟加载属性。

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

findbyidgetone之间的区别在于前者返回一个惰性代理,而后者使用一个热切加载的对象。一些关于原因的信息可以在这里找到。

 类似资料:
  • 我想使用Eclipse调试器逐步分析Oracle JDK实现的一些类。 因此,我从Oracle(JDK1.8.0_77)下载了当前的JDK,通过Windows安装程序安装了Eclipse并编写了一个简单的HelloWorld类。 我将Eclipse配置为使用JDK中包含的JRE,而不是标准的JRE,并确保步骤过滤器既不在首选项中设置,也不在调试视图中应用,如以下答案所述: Eclipse步进调试

  • 我正在尝试使用IntelliJ调试Spring Boot项目。突然,我的线路在工作了几年后无法调试。 它将通过类进行调试,但当我尝试运行一个方法时,它不会看到断点。我之前收到了一个应用程序上下文消息,我修复了它,但它仍然不起作用。https://www.jetbrains.com/help/idea/2021.2/spring-support.html#spring-file-set 它将在后台看

  • 我正在尝试使用智能 J 调试我的 Java 服务器。每次我启动调试器时,它都会显示: 运行游戏调试时出错:无法打开调试器端口:java.net。ConnectException“连接被拒绝:连接” 我关闭了Windows防火墙以及防病毒扫描程序,但它仍然显示错误。

  • 问题内容: 我想在异步for循环遍历Javascript对象的值完成执行后调用一个函数。我有以下代码 问题答案: 这可以在普通JS中完成,但是我建议使用模块,它是用于处理Node.js中异步代码的最流行的库。例如,使用: 如果要使用每次迭代的结果,则类似,但是将结果数组传递给回调的第二个参数。 如果您喜欢香草JS,则可以代替: (摘自我前段时间写的要点) 我强烈建议您使用异步库。异步很容易编写,类

  • 我试图用IntelliJ远程调试liquibase项目的maven插件。问题是IDEA突出显示了错误的源代码行,我不知道为什么。我试图调试的源代码没有被触及。我从我在IntelliJ中使用的源代码中手动构建并安装了本地maven存储库中的插件。我的Intellij版本是,maven版本是,运行在Ubuntu12.04上。 为了调试maven插件,我使用了comand。如果有人对什么是错误有一丁点的