spring-data-jpa表实体序列化后触发所有懒加载.

需求

我想做到的是 需要的时候触发(.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.9k
评论
    1 个回答

    有知道的吗?

      撰写回答

      登录后参与交流、获取后续更新提醒