首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

SSH框架中懒加载有关问题 !求大神

2013-07-04 
SSH框架中懒加载问题在线等!!!!求大神表的结构如图:用hibernate维护,语句为public ListPubRequest getRe

SSH框架中懒加载问题 在线等!!!!求大神
表的结构如图:SSH框架中懒加载有关问题  !求大神
用hibernate维护,语句为

public List<PubRequest> getRequest(String userName) {

Session session = sessionFactory.openSession();

//@SuppressWarnings("unchecked")  嘛意思
List<PubRequest> pubrequests =  session
.createQuery("from PubRequest as p where p.pubuser.userName = ? and p.allowText ='同意' ")
.setString(0, userName)
.list();

for(PubRequest pubrequest:pubrequests){
System.out.println(pubrequest.getAllowText()+"============================");
}
for(PubRequest pubrequest:pubrequests){
System.out.println(pubrequest.getPubuser().getTrueName()+"============================");
System.out.println(pubrequest.getPubtest().getTestName()+"============================");
}

session.close();
return pubrequests;
}

}


其中allowText的值可以输出,但是下面的引用外键的不可以输出

下面是三个bean类,lazy不去掉也不对,如果把lazy去掉或改成不是懒加载机制,直接报
java.lang.NullPointerException
org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:2314)
org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:664)
org.hibernate.type.EntityType.resolve(EntityType.java:444)
org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168)
org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:134)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:999)
org.hibernate.loader.Loader.doQuery(Loader.java:878)
package com.niit.bean;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import org.hibernate.annotations.Proxy;
/**
 * 
 * 考试信息表
 */
@Entity
public class PubTest implements Serializable{

@Id
@GeneratedValue
private int testId;                     //考试id
private String testName;                //考试名
@Column(columnDefinition="timestamp")
private Date startTime;                 //开始时间
@Column(columnDefinition="timestamp")
private Date endTime;                   //结束时间
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="tacticsId")            //策略
private PubTactics pubtactics;        
private String isTimeOut;               //是否过期
@OneToMany(mappedBy="pubtest",fetch=FetchType.LAZY)
private Set<PubExamQuestion> pubexamquestions; //考试对应表(用来两表关联)
@OneToMany(mappedBy="pubtest",fetch=FetchType.LAZY)
private Set<TestPersonList> testPersonLists; //考试结果表


@OneToMany(mappedBy="pubtest",fetch=FetchType.LAZY)
private Set<PubRequest> pubRequests; //考试请求表
    @OneToOne(mappedBy="pubtest",fetch=FetchType.LAZY)
private PubTestList pubtestlist;  //考试结果表(总)

/*方法略*/

}


package com.niit.bean;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

/**
 * 考生信息表
 */
@Entity
public class PubUser implements Serializable {

@Id
@GeneratedValue
private int userId; // 考生ID
@Column(unique = true)
private String userName; // 登录用户名
@Column(nullable = false)
private String userPassword; // 登陆密码
private String examId; // 准考证号
private String userSex; // 考生性别
private String cardType; // 证件类型
private String cardNum; // 证件号码
private String userPhone; // 联系电话
private String communiType; // 联系方式
private String communiNum; // 即时通讯号
private String userAddress; // 考生地址
private String trueName; // 考生真实姓名
private String userSchool; // 考生学校
private String userEmail; // 考生邮箱
private String userPost; // 考生邮编
private String userClass; // 考生所在班级
@OneToMany(mappedBy = "pubuser", fetch = FetchType.LAZY)
private Set<TestPersonList> testPersonLists; // 考试结果表
@OneToMany(mappedBy = "pubuser", fetch = FetchType.LAZY)
private Set<PubRequest> pubrequests; // 考试申请

/*方法略*/

}

package com.niit.bean;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
/**
 *考试请求表 
 */
@Entity
public class PubRequest implements Serializable {
@Id
@GeneratedValue
private int requestId;             //请求ID
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="testId",nullable=false)           
private PubTest pubtest;           //考试信息
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="userId",nullable=false)  
private PubUser pubuser;           //考生ID
private String allowText;          //是否同意
private Date RequestTime;          //申请日期



/*方法略*/

SSH 框架 Java

lazy
[解决办法]
主表:
@JsonIgnore//json转换时忽略该属性
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)//懒加载,所有操作级联
@JoinColumn(name = "testId")//外键名(你的应该是主表的主键吧)
private Set<PubRequest> pubRequests = new HashSet<PubRequest>(); //考试请求表

子表:
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })//级联保存、级联更新
@JoinColumn(name = "testId")
private PubTest pubtest;
一对多子表不用注释加载方式

[解决办法]
楼主你的代码很有问题啊, // @SuppressWarnings("unchecked")嘛意思   这个不用管,为了去掉项目中的! 叹号    
 fetch=FetchType.LAZY这个不用写 @OneToMany默认的就是LAZY,
 @ManyToOne默认的是FetchType.EAGER如果写上@OneToMany(fetch = FetchType.LAZY很可能出问题
如果用@OneToMany显示懒加载异常可以改成fetch=FetchType.EAGER
你的最后几行代码
@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="testId",nullable=false)           
    private PubTest pubtest;           //考试信息
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="userId",nullable=false)  
nullable=false是普通属性用的,不是用在这里,把最后两个fetch=FetchType.LAZY改成fetch=FetchType.EAGER试试吧,最后问一句你是天津的吗

热点排行