SSH框架中懒加载问题 在线等!!!!求大神

Java_Tome 2013-05-06 02:02:51
表的结构如图:
用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; //申请日期



/*方法略*/

...全文
178 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Java_Tome 2013-06-08
  • 打赏
  • 举报
回复
恩,我把加载机制全去掉了,对了,那一对一呢,加了可以吗,或者多对多??可以加吗?
引用 1 楼 popkidorc 的回复:
主表: @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; 一对多子表不用注释加载方式
Java_Tome 2013-06-08
  • 打赏
  • 举报
回复
不是天津的阿,我后来把 上面所有加载机制全去掉了,就正常了,好蛋疼得,你知道原因吗?
a82759082 2013-05-07
  • 打赏
  • 举报
回复
楼主你的代码很有问题啊, // @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试试吧,最后问一句你是天津的吗
popkidorc 2013-05-06
  • 打赏
  • 举报
回复
主表: @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; 一对多子表不用注释加载方式

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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