账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    spring-data-jpa表实体序列化后触发所有懒加载.
    43
    0

    需求

    我想做到的是 需要的时候触发(.size)懒加载加载关联表的所有数据,不需要的时候不加载关联表的数据,随心所欲.

    问题

    我的表实体有很多一对多、一对一的关联关系

    user 是一端(mappedBy指定的维护端)
    order 是多端

        // in the user
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
        @JsonIgnore
        private Set<Order> orders;
        // in the order
        @ManyToOne(fetch = FetchType.LAZY)
        @JsonIgnore
        private User user;

    我都给他们加上了LAZY

    我在控制层用@RestController(通过jackson)返回json格式数据给前端.

    没想到天杀的jackson序列化对象成json的时候会触发全部懒加载.

    对于jsckson只能加上@JsonIgnore并且重写equals和hashCode来忽略掉.

    结果不能随心所欲了...

    这就和我的初衷不相符了.

    期待大大们的解答.

    目前操作

    所有关联表的属性都通过@JsonIgnore注解掉,避免被序列化
    通过 user.getOrders().size触发懒加载, getOrders() 获取用户所有订单.然后把user和orders集合都放到一个map中传给前端(好麻烦,而且json格式和名称什么的都全部改一遍)
    期望:

    {
        name: xxx,
        age: xxx,
        orders: [
            id: xxxx,
            date: xxx
        ]
    }

    现实:

    # 不能把orders放到user中,会被jackson忽略掉的.因为user的orders属性被我@JsonIgnore了
    {
        user: {
            name: xxx,
            age: xxx,
        }
        orders: [
            id: xxxx,
            date: xxx
        ]
    }

    想到的方案

    添加一个转换类把实体转换成map,list再由jackson转json返回到前端(兼容问题和业务问题一堆一堆的)
    spring data rest的控制层能返回不触发懒加载的json到前端.(还是没有改变现状)

    希望

    有更好更完美的方式.

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部