V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
seliote
V2EX  ›  Java

求教 SpringDataJpa 大神一个问题

  •  
  •   seliote · 2021-09-05 20:34:42 +08:00 · 1510 次点击
    这是一个创建于 935 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    现象非常奇怪,同一查询,在其他方法中正常,但是在这个方法中 JSR 303 Bean 校验没有通过,查看后发现返回的所有数据域均为 null,见下图。

    数据库里数据是存在的,其他地方的调用返回的数据是正常的,比如下面这里。

    这两者之前的调用也都是类似的,查询用户信息,其中用户信息实体与错误代码实体以 @ManyToOne 关联并启用了延迟加载,如下:

    排查进展

    偶然尝试把用户信息实体中的懒加载替换为立即加载 FetchType.EAGER,问题就不再出现了,但是仍然不知道为什么。

    很明显这里并没有直接用到延迟加载,错误代码是直接加载的数据库,但是关掉延迟加载后就正常,理论上报错的代码查出的数据等于延迟加载的这条数据,所以怀疑是不是延迟加载导致缓存中应有的数据未加载,而二次查询时没打到数据库而是直接访问的 Hibernate 缓存,延迟加载也失效了,从而导致二次查询数据域均为 null,但是这么来说的话又解释不了另一个查询为什么是正常的。

    seliote
        1
    seliote  
    OP
       2021-09-06 18:04:26 +08:00
    已经解决。
    原因是打开了 open-in-view 让 Hibernate 共享的 session 缓存导致得到的是个代理对象,JSR 303 又直接用反射拿的域属性,导致校验失败了。
    具体定位过程见 https://www.cnblogs.com/seliote/p/15230641.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2871 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:38 · PVG 19:38 · LAX 04:38 · JFK 07:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.