zoukankan      html  css  js  c++  java
  • JPA 懒加载实践 fetch = FetchType.LAZY

    项目里用到JPA关系映射,导致一个普通的查询方法会执行数十条sql,使用懒加载的方式解决。当时配置过懒加载之后,还是失效 会执行sql 于是反复试验 排查得出一些结论。

     

     

     第一次我的代码是这样的,感觉应该没有问题。但是每次执行到打断点这一行,会执行关联查询的sql。

    坑!坑!坑!这里有坑请注意  最后排查发现是因为我的实体类用了lombok的@Data注解导致的。单独使用@Getter 和 @Setter方法就可以了。

    我还测试了第二种方法,直接返回实体类对象,但是才开始会报一个cast错误 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 错误 大意就是 数据类型转换失败,懒加载的字段查出来并不为null而是一个叫hibernateLazyInitializer的东西  于是百度到@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})  这样的写法  虽然不报错了  但是return 的时候还是会去执行sql,只有把这个字段@JsonIgnore才正常

    注意 不加@JsonIgnore就必须加@JsonIgnoreProperties(value = { "hibernateLazyInitializer"}) 否则JPA直接输出就会报错

    1. 所以总结出两种用法,第一种就是查出来之后 利用VO封装,但是注意实体类不能用lombok的@Data及以上的注解。

    2. 直接返回实体类,但是需要把lazy字段 忽略掉 才可以,如果其他时候要用到 需要继续封装VO赋值才可以。

     

    仅作为个人经验总结,欢迎指教。

  • 相关阅读:
    [BZOJ3105][CQOI2013]新Nim游戏
    [BZOJ4592][SHOI2015]脑洞治疗仪
    [BZOJ3551][ONTAK2010]Peaks加强版
    [BZOJ2229][ZJOI2011]最小割
    [BZOJ4519][CQOI2016]不同的最小割
    [BZOJ3532][SDOI2014]LIS
    [BZOJ2668][CQOI2012]交换棋子
    [BZOJ3504][CQOI2014]危桥
    Java抽象类
    Java方法覆盖重写
  • 原文地址:https://www.cnblogs.com/wgb123/p/13371680.html
Copyright © 2011-2022 走看看