代码之家  ›  专栏  ›  技术社区  ›  Robbo_UK

Intellij调试器休眠对象的单步执行值为空

  •  3
  • Robbo_UK  · 技术社区  · 6 年前

    当我用intellij遍历hibnerate对象时,调试窗口中的对象似乎为空。标记为 $$_hibernate_interceptor

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

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

    我想看看从subscriptionrepository返回并分配给 Debug: 窗口。

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

    enter image description here

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

    所以这里有几个问题

    • 是什么 $$休眠拦截器

    进一步的发现

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   cfstras    6 年前

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

    直到第一次访问它们,比如 toString() ,它们将为空。 你可以通过增加一个可变的手表(小 + icon)在“subscription.toString()”上。

    两者之间的区别 findById getOne 前者返回一个懒惰的代理,而后者使用一个热切加载的对象。关于原因的一些信息 can be found here .