现象非常奇怪,同一查询,在其他方法中正常,但是在这个方法中 JSR 303 Bean 校验没有通过,查看后发现返回的所有数据域均为 null,见下图。
数据库里数据是存在的,其他地方的调用返回的数据是正常的,比如下面这里。
这两者之前的调用也都是类似的,查询用户信息,其中用户信息实体与错误代码实体以 @ManyToOne
关联并启用了延迟加载,如下:
偶然尝试把用户信息实体中的懒加载替换为立即加载 FetchType.EAGER
,问题就不再出现了,但是仍然不知道为什么。
很明显这里并没有直接用到延迟加载,错误代码是直接加载的数据库,但是关掉延迟加载后就正常,理论上报错的代码查出的数据等于延迟加载的这条数据,所以怀疑是不是延迟加载导致缓存中应有的数据未加载,而二次查询时没打到数据库而是直接访问的 Hibernate 缓存,延迟加载也失效了,从而导致二次查询数据域均为 null,但是这么来说的话又解释不了另一个查询为什么是正常的。
1
seliote OP 已经解决。
原因是打开了 open-in-view 让 Hibernate 共享的 session 缓存导致得到的是个代理对象,JSR 303 又直接用反射拿的域属性,导致校验失败了。 具体定位过程见 https://www.cnblogs.com/seliote/p/15230641.html |