求教 SpringDataJpa 大神一个问题

2021-09-05 20:34:42 +08:00
 seliote

问题描述

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

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

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

排查进展

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

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

1725 次点击
所在节点    Java
1 条回复
seliote
2021-09-06 18:04:26 +08:00
已经解决。
原因是打开了 open-in-view 让 Hibernate 共享的 session 缓存导致得到的是个代理对象,JSR 303 又直接用反射拿的域属性,导致校验失败了。
具体定位过程见 https://www.cnblogs.com/seliote/p/15230641.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX