Hibernate懒加载对象转JSON报错,困扰了一周了

diyinyu0476 2017-09-07 01:47:55
项目是SpringMVC+Spring+Hibernate前后端分离架构,后端负责的就是给前端传JSON
Hibernate的懒加载很好用,大大减轻服务器负担,但是SpringMVC支持的Jackson遇到hibernate的懒加载对象似乎没有什么好的处理办法,报错500 no session,也就是数据库已经关闭,懒加载的对象读不出来。
网上找了很多方法:
1、fetchType=eager 数据一次性全部取出
2、@JsonIgnore 把部分字段不json化
这两种因噎废食,无法满足需求
3、实体类上方加注解
@JsonIgnoreProperties(value = {"hibernateLazyInitializer","handler","fieldHandler"})
不知道什么原因完全没有效果
4、web.xml设置拦截器OpenSessionInViewFilter
同样没有效果,不知道是否和前后端分离有关
折腾了几天都没法解决这个问题
请教一下各位有没有什么好的解决办法,万分感谢!
...全文
511 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
子灬丶逾 2019-05-25
  • 打赏
  • 举报
回复
把懒加载设为false 试一试
dennyooo 2018-11-01
  • 打赏
  • 举报
回复
我们也碰到过这个问题,但我们在需要转换为json时,通过重新定义一个本地类来解决(属性与实体对象完全一样),在需要值时,传入实体对象给本地类来构造已加载过数据的对象。然后再序列化,就OK了
diyinyu0476 2017-09-08
  • 打赏
  • 举报
回复
引用 2 楼 pany1209 的回复:
使用Hibernate.initialize(Object obj)为mobiles初始化试试。。。。。
是可以暂时解决,但是对于每次json化都要对所有关联字段设一下太复杂,这样子Hibernate的懒加载就起不到他的作用反而碍手碍脚了
James2119X 2017-09-07
  • 打赏
  • 举报
回复
我遇到的情况是json中有B类属性需要保存到数据库中保存不进去,你这是从数据库中读取B类属性...
李德胜1995 2017-09-07
  • 打赏
  • 举报
回复
使用Hibernate.initialize(Object obj)为mobiles初始化试试。。。。。
diyinyu0476 2017-09-07
  • 打赏
  • 举报
回复
报错信息
HTTP Status 500 - Could not write JSON: failed to lazily initialize a collection of role: com.wfy.web.model.MobileInbound.mobiles, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.wfy.web.model.MobileInbound.mobiles, could not initialize proxy - no Session (through reference chain: com.wfy.web.common.ServerResponse["data"]->java.util.ArrayList[0]->com.wfy.web.model.MobileInbound["mobiles"])
出错的实体类部分代码

@Entity
@Table(name = "t_mobile_inbound")
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer","handler","fieldHandler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@DynamicUpdate
public class MobileInbound {
    private String id;
    private Supplier supplier;
    private MobileModel mobileModel;
    private Color color;
    private Config config;
    private double buyPrice;
    private int quantity;
    private double amount;
    private Date inputTime;
    private User inputUser;
    private Date checkTime;
    private User checkUser;
    private CheckStatus status;
    private Dept dept;
    private String remark;
    private List<MobileStock> mobiles;

    @OneToMany(mappedBy = "mobileInbound", cascade = CascadeType.ALL)
    public List<MobileStock> getMobiles() { // 这个字段一对多对应另一个实体,就是懒加载报错的地方
        return mobiles;
    }

    public void setMobiles(List<MobileStock> mobiles) {
        this.mobiles = mobiles;
    }

//省略其余getters, setters

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧