seliote
V2EX  ›  Java

求教 SpringDataJpa 大神一个问题

  •  
  •   seliote · Sep 5, 2021 · 2377 views
    This topic created in 1745 days ago, the information mentioned may be changed or developed.

    问题描述

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

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

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

    排查进展

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

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

    seliote
        1
    seliote  
    OP
       Sep 6, 2021
    已经解决。
    原因是打开了 open-in-view 让 Hibernate 共享的 session 缓存导致得到的是个代理对象,JSR 303 又直接用反射拿的域属性,导致校验失败了。
    具体定位过程见 https://www.cnblogs.com/seliote/p/15230641.html
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   922 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:19 · PVG 05:19 · LAX 14:19 · JFK 17:19
    ♥ Do have faith in what you're doing.