hibernate+spring mvc, 解决hibernate 对象懒加载 json序列化问题

引用地址

在使用Spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例:

 

Java代码  

  1. @RequestMapping("login")  
  2.     @ResponseBody  
  3.     public Object login(@RequestParam String username,@RequestParam String password){  
  4.         List<User> list=userDAO.findByUsername(username);  
  5.         if(list.size()>0){  
  6.             User user=list.get(0);  
  7.             if(user.getPassword().equals(password)){  
  8.                 return new Result(user, "操作成功", true);  
  9.             }else{  
  10.                 return new Result(null, "密码错误", true);  
  11.             }  
  12.         }else{  
  13.             return new Result(null, "用户未注册", false);  
  14.         }  
  15.     }  

 客户端抛出org.hibernate.LazyInitializationException异常。通过查询资料和摸索整理出三种解决方法:

第一种:(推荐)

在web.xml中加入:

Xml代码  

  1. <filter>  
  2.         <filter-name>openSession</filter-name>  
  3.         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>singleSession</param-name>  
  6.             <param-value>false</param-value>  
  7.         </init-param>  
  8.     </filter>  
  9.     <filter-mapping>  
  10.         <filter-name>openSession</filter-name>  
  11.         <url-pattern>/*</url-pattern>  
  12.     </filter-mapping>  

 这样返回的Spring mvc返回的Json串也包含一对多关系中的对象,不过都是空的。

Js代码  

  1. {"message":"操作成功","results":{"language":null,"id":"402881e6421e40b601421e4111c60001","type":null,"extra":null,"time":null,"username":"wanggang","msg":null,"password":"138333","tag":null,"tel":null,"qq":null,"email":null,"gender":null,"lat":null,"lang":null,"point":null,"openid":null,"city":null,"photo":null,"notes":[],"chatsForUserTwoId":[],"attentionsForUserId":[],"attentionsForAttentionUserId":[],"logs":[],"chatsForUserOneId":[],"commentsForNoteId":[],"commentsForUserId":[]},"success":true}  

 第二种方法(推荐):

在一对多的关系中加@JsonIgnore,这样Jackson在转换的时候就会过滤掉这个对象:

Java代码  

  1. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")  
  2. @JsonIgnore  
  3. public Set<Log> getLogs() {  
  4.     return this.logs;  
  5. }  
  6.   
  7. public void setLogs(Set<Log> logs) {  
  8.     this.logs = logs;  
  9. }  

 第三种方式:

把fetch模式配置成“FetchType.EAGER”,这样的方式可以解决问题,但是这样的方式会强制提取一对多关系中的数据,生成很多无用数据,也会增加系统负担,所以不建议采用。

Java代码  

  1. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")  
  2.     public Set<Log> getLogs() {  
  3.         return this.logs;  
  4.     }  
  5.   
  6.     public void setLogs(Set<Log> logs) {  
  7.         this.logs = logs;  
  8.     }  

其实还有一种方法,就是jsonignore注解方法

时间: 2024-10-04 14:07:56

hibernate+spring mvc, 解决hibernate 对象懒加载 json序列化问题的相关文章

spring mvc easyui 中tree如何加载数据

问题描述 spring mvc easyui 中tree如何加载数据 easyUI tree如何加载spring mvc 传过来的数据,..也不知道传过来没有 解决方案 就这样写可以了,还是其它什么意思? $('#tt').tree({ url:'/...' // Spring MVC 请求的地址 }); 解决方案二: 已经解决了,原来直接返回数据时还需要一个@responseBody的注解. 不过还是非常感谢

hibernate get方法 懒加载异常

问题描述 hibernate用get方法怎么也懒加载异常呢?情况是这样device类中有个product类 他们的关系是多对一 ,many to one 这里没有显示的写上lazy属性(默认是proxy吧?),不过many-to-one这里确定要懒加载的而现在我想通过get方法得到device对象,在得到product,hibernate为什么会报懒加载异常呢?不是说get不会看懒加载么? 问题补充:可是多对一的一方,其他人想要延时加载啊,毕竟不是每查一个device类就一定要知道product

hibernate之xml映射文件关系维护,懒加载,级联

      一:关系维护   --->inverse默认值false,表示不放弃关系的维护.   --->inverse="true"配置在那一端,表示那一端xml对应的po放弃关系的维护(交由hibernate内部进行维护),由另一端进行关系维护.  例子:学生班级模型[多对一模型]一端放弃关系的维护,由学生端进行关系维护              ----->班级的xml映射文件中<set name="students" class=&q

lazy-hibernate 懒加载机制及抓取策略

问题描述 hibernate 懒加载机制及抓取策略 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.gycn.model.Hotel.roomTypes, no session or session was closed 出现这种情况是因为用了懒加载,但是有的地方需要加载集合,有的地方则不用,那么lazy这个属性到底要怎么设置呢? 解决方案 抓取策略应

spring mvc-Spring mvc结合Hibernate中实现ajxa出现懒加载异常

问题描述 Spring mvc结合Hibernate中实现ajxa出现懒加载异常 我要实现一个选择省份加载城市列表,然后选择城市加载区列表的操作,但是我在加载城市的时候一直报懒加载异常,session提前关闭,我觉得是因为我城市中设置的private Province province 对象的原因,请问大神这有什么好的解决办法吗 解决方案 懒加载的话,你直接用fetch属性设为eager就行了,session提前关闭,,可能是你的openSessionInView,,这个过滤器没用,,而且省市区

hibernate3-spring mvc OpenSessionInViewFilter hibernate 懒加载问题

问题描述 spring mvc OpenSessionInViewFilter hibernate 懒加载问题 之前做了一个项目是使用 springmvc 加hibernate 做的, 并且使用了 hibernate 的懒加载有用到OpenSessionInViewFilter, 现在做另一个项目, 基础代码都是上个项目的代码: 目前调试在调试权限模块, 核对了上个项目的代码基本完全一致,但是这个项目的老是无法使用懒加载,加载报 org.hibernate.LazyInitializationE

问一个hibernate的懒加载的问题

问题描述 问一个hibernate的懒加载的问题 1.我定义Survey和Page类,Survey设置Page的集合属性,然后建立双向关联,我故意把集合注解成懒加载... 2.然后我通过这段代码把Page集合重数据库取出 3.然后调用Survey的get方法得到集合,再把Page一个一个放进集合中去 4.然后再外面迭代Survey的page集合抛异常是懒加载为什么?为什么?为什么? /* *通过survey的id取出survey *(我用spring在这方法上面配置了事务) */ public

懒加载session-多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功

问题描述 多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功 最近写了一个多数据源的代码,结果在使用的过程中出现了在一个请求中(方法中)两个数据库交替使用的情况,最后情况是数据库切换不过来 并且在项目配置中有懒加载和OpenSessionInViewFilter 数据库一个为本地数据库一个为基金数据库 要做的事情就是在本地查询到基金代码接着再循环去基金库查询基金数据 中间报错为在本地数据库中查询不到某个表(其实是在基金库中) controller层 @Reque

Hibernate懒加载解析

Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了. 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库.    实现懒加载的前提:  1 实体类不能是final的 2 能实现懒加载的对象都是被CGLIB(反射调用)改