最近在做项目的时候使用的框架结构是springMVC+hibernate+easyui。
但在实际开发过程中遇到了一个问题就是:由于hibernate为了提高读取效率,使用了懒加载的机制,但是在实际前台读取JSON的时候确报错:No serializer found for class
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no
properties discovered to create BeanSerialize……原因是启用了懒加载机制,但是JSON回去读全部的内容,读不到而导致出错。
一开始想既然JSON读不到,而我做的只是给一个工厂用的小的库房管理系统,如果不考虑懒加载呢?于是我把所有的model的关联关系中的懒加载都取消,问题又来了:这次用火狐的debug看控制台,发现传到前台的JSON数据无线循环,eclipse后台也报错了。然后上网找了一堆这样的问题,发现基本有两种解决方案:
1.使用vo+do,前后台分层的机制,do对象是从数据库里查出来的持久化对象,vo是为了给页面展示,直接new的视图对象。
这种方案也是我最初想到的一种方案,但是有个缺点就是需要写一堆的重复代码。因为vo和do的区别就是vo之间的关系没有do紧密,只需要把do中需要展示的属性赋予do即可。比如:现在我有一个user对象和一个role对象。二者是多对一的关系,在用户列表中需要展示用户的角色信息(用户角色名)。vo和do我是这么设计的:
UserVO:
package com.app.permission.model.vo;
import java.util.Date;
public class UserVO {
private Integer id;
private String username;
private String password = "123456";
private String realName;
private String roleName; // 角色名
private Integer roleId; // 角色ID
private String departmentName;
private Integer departmentId;
private String departmentCode;
private String sex;
private Integer activeFlag = 1;// 是否有效:1有效,0无效
private String tel;
private String email;
private String description;
private Date createDate = new Date();
private String idcard;
private Date loginTime;//
private String userSecurity;// 用户密级
private String address;// 现住址
private String mobileTel;// 手机号
private String homeTel;// 家庭电话
//。。。。省略get和set
}
UserDO:
package com.app.permission.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
/**
* 用户
*
* @author gefangshuai
* @email gefangshuai@163.com
* @createdate 2012-11-3下午12:11:46
*/
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
private Integer id;
private String username;
private String password = "123456";
private String realName;
private String sex;
private Integer activeFlag = 1;// 是否有效:1有效,0无效
private String tel;
private String email;
private String description;
private Date createDate = new Date();
private Role role;
private Department department;
private String idcard;
private Date loginTime;//
private String userSecurity;// 用户密级
private String address;// 现住址
private String mobileTel;// 手机号
private String homeTel;// 家庭电话
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getMobileTel() {
return mobileTel;
}
public void setMobileTel(String mobileTel) {
this.mobileTel = mobileTel;
}
public String getHomeTel() {
return homeTel;
}
public void setHomeTel(String homeTel) {
this.homeTel = homeTel;
}
/**
* 流水号
*
* @return
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
* 用户名
*
* @return
*/
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
/**
* 密码
*
* @return
*/
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
/**
* 真实姓名
*
* @return
*/
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
/**
* 是否有效 1有效 0无效
*
* @return
*/
public Integer getActiveFlag() {
return activeFlag;
}
public void setActiveFlag(Integer activeFlag) {
this.activeFlag = activeFlag;
}
/**
* 联系电话
*
* @return
*/
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
/**
* 邮箱
*
* @return
*/
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
/**
* 备注描述
*
* @return
*/
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
/**
* 创建日期
*
* @return
*/
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
/**
* 用户拥有的角色
*
* @return
*/
@ManyToOne()
@JoinColumn(name = "roleId")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
/**
* 用户所在部门
*
* @return
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "departmentId")
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
/**
* 身份证号码
*
* @return
*/
public String getIdcard() {
return idcard;
}
public void setIdcard(String idcard) {
this.idcard = idcard;
}
/**
* 上次登录时间
*
* @return
*/
public Date getLoginTime() {
return loginTime;
}
public void setLoginTime(Date loginTime) {
this.loginTime = loginTime;
}
/**
* 用户密级
*
* @return
*/
public String getUserSecurity() {
return userSecurity;
}
public void setUserSecurity(String userSecurity) {
this.userSecurity = userSecurity;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
二者之间的区别就是DO中是完整的和Role的关联关系,VO提供供展示的属性,比如我在用户列表中只需要将对应用的角色名字展示,那么我在设计VO的时候,只需要一个String类型的roleName即可,当然为了前台关联方便,我将roleId也传到前台当隐藏表单。
这种设计思路是比较清晰容易的一种思路,但是如果我的DO中有100个属性呢?是不是在进行DO和VO转化的时候进行100次get和set呢?这样无用的工作量太大了,幸好apache有现成的工具类给我们用:org.apache.commons.beanutils.BeanUtil这个类有copyProperties(Object dest, Object orig),这个方法可以将两个相似的对象只要属性名相同可以进行属性值的拷贝。省了我们很多的功夫。
2.使用@JsonIgnoreProperties(value={"hibernateLazyInitializer"})注解。
当然我最先想如果这种方案能解决问题,就一个注解搞定,但是试了好多次这种方法都没成功,大牛是否能提供一下完整的解决思路呢?
以下是没成功的代码:
/**
* 用户拥有的角色
*
* @return
*/
@ManyToOne()
@JoinColumn(name = "roleId")
@JsonIgnoreProperties(value={"hibernateLazyInitializer"})
public Role getRole() {
return role;
}
是不是除了加一个注解还需要配置什么东西?
分享到:
相关推荐
在Java持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,用于提高应用程序的性能和效率。懒加载的基本思想是“按需加载”,即在实际需要数据时才进行数据库查询,而不是在对象初始化时一次性加载所有...
在Java的Web开发中,Spring框架与Hibernate的整合是常见的数据访问层实现方式。Spring提供了强大的依赖注入(DI)和AOP(面向切面编程...以上就是关于"集成spring的hibernate懒加载"问题的详细解析,希望对你有所帮助。
在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...
Struts2、Spring、Hibernate、jQuery 和 JSON 是五个在IT行业中极为重要的技术组件,它们各自在Web应用开发中扮演着不同的角色。这篇文章将详细介绍这些技术的整合使用以及它们的功能。 首先,Struts2 是一个基于 ...
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
本文将浅谈解决Hibernate懒加载问题的四种方式,并分析每种方式的适用场景和可能带来的影响。 Hibernate的懒加载策略是一种优化手段,它延迟了对象属性的加载,直到真正需要这些数据的时候才从数据库中获取。这种...
去除预加载的Viewpager,加载第一页时不会默认加载第二页,
MySQL 连接超时问题解决方案 wait_timeout 参数的重要性 在 MySQL 中,wait_timeout 参数是控制连接超时的关键参数。当该参数设置的太大时,可能会导致 MySQL 中大量的 SLEEP 进程无法及时释放,拖累系统性能。...
通过配置OpenSessionInViewFilter,可以在很大程度上解决懒加载异常的问题,尤其是在Java Web应用中使用Hibernate等ORM框架时。当然,还需要根据实际项目的具体情况,灵活调整和优化配置,以达到最佳的性能和稳定性...
因此,延迟加载提供了一种解决方案:只在真正需要时加载这些关联对象。 **示例分析** 考虑一个`Person`类,它具有一个`addresses`集合属性,该属性中存储的是`Address`类型的对象。假设每个`Person`可能有多个地址...
在处理CRUD(创建、读取、更新、删除)操作时,JSON可以用于在Hibernate的持久化对象和客户端之间传输数据,减少了对XML或自定义格式的依赖。 Struts2是Java Web开发中的一个MVC(模型-视图-控制器)框架,它提供了...
2. **懒加载失效**:在JSP页面上直接访问延时加载的属性可能导致懒加载失效,因为JSP执行在Web容器的上下文中,而这个上下文可能在Session关闭后。为解决此问题,可以在Controller层或Service层提前加载关联数据,...
### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在数据库交互中尤为重要。其核心思想是仅在确实需要某个资源时才加载它,而非一开始就加载...
标题中的“Hibernate lazy加载FOR Connection”指的是Hibernate框架中的一种特性,即懒加载(Lazy Loading)。在Hibernate中,懒加载是一种优化策略,它推迟对关联对象的加载,直到真正需要使用这些对象时才进行加载...
1. **Spring**:作为 Java 领域中最受欢迎的框架之一,Spring 提供了一整套解决方案,包括但不限于依赖注入、面向切面编程(AOP)、数据访问/集成、事务管理等。 2. **Hibernate**:是一个对象关系映射(ORM)工具,...
《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...
在"ZTree 异步加载 SSH JSON"这个主题中,我们将深入探讨如何利用ZTree实现异步加载数据,并结合SSH(Spring、Struts2、Hibernate)框架以及JSON格式的数据来完成这一过程。 首先,SSH框架是Java Web开发中的常用...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
懒加载,即延迟加载,是Hibernate为解决负载问题而设计的一种策略。其核心在于推迟与数据库的交互,直到真正需要数据时才进行查询。这不仅降低了数据库的压力,还提高了应用程序的运行效率。 #### 映射中的懒加载...