关于懒加载的问题,org.hibernate.LazyInitializationException,求教

爱吃回锅肉 2012-07-08 10:24:21
RT
web.xml中加入
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

两个类的XML如下,一个是Student类,一个是课程类,Course
<hibernate-mapping>
<class name="com.bzu.entity.Course" table="Course">
<cache usage="read-write" region="com.bzu.entity.Course"></cache>
<id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="native" />
</id>
<version name="version" column="version" type="integer"></version>
<property name="name" type="java.lang.String">
<column name="Name" length="10" not-null="true" />
</property>
<property name="lessonTime" type="java.lang.Integer"/>
<property name="lessonHour" type="java.lang.Integer"/>
<property name="lessonPoints" type="java.lang.Integer"/>
<set name="students" table="stu_course" cascade="save-update" lazy="true">
<key column="course_id"/>
<many-to-many class="com.bzu.entity.Student" column="stu_id"></many-to-many>
</set>
</class>
</hibernate-mapping>

<hibernate-mapping>
<class name="com.bzu.entity.Student" table="Student">
<cache usage="read-write" region="com.bzu.entity.Student"></cache>

<id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="native" />
</id>
<version name="version" column="version" type="integer"></version>
<property name="name" type="java.lang.String">
<column name="Name" length="10" not-null="true" />
</property>
<property name="idCard" type="java.lang.String">
<column name="idCard" length="50" />
</property>
<property name="password" type="java.lang.String" />
<property name="sex" type="java.lang.Integer">
<column name="sex" length="30" />
</property>
<property name="birthday" type="java.lang.String">
<column name="birthday" length="10" />
</property>
<property name="major" type="java.lang.String">
<column name="major" length="30" />
</property>

<property name="photopath" type="java.lang.String" />

<set name="courses" table="stu_course" cascade="save-update" lazy="true">
<key column="stu_id" />
<many-to-many class="com.bzu.entity.Course" column="course_id" ></many-to-many>
</set>
</class>
</hibernate-mapping>

调用的时候根据学生ID去查询那个学生选了什么课程
public String getCourse() {

Set<Course> set = dao.getCourse(Student.class, stu.getId());
ServletActionContext.getRequest().getSession().setAttribute("set", set);
return SUCCESS;

}
////////////调用dao.getCourse
public Set<Course> getCourse(Class clazz, Serializable id) {

Set<Course> set = new HashSet<Course>();
Student stu = null;
System.out.println("getCourse()++++++++++01");
if (HibernateUtil.select(clazz, id) != null) {
System.out.println("getCourse()++++++++++02");
stu = (Student) HibernateUtil.select(clazz, id);
System.out.println("getCourse()++++++++++03");
set = stu.getCourses();
System.out.println("getCourse()++++++++++04");
return set;
}

else
return null;

}
当执行完set = stu.getCourses();打印System.out.println("getCourse()++++++++++04");的时候就报
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.bzu.entity.Student.courses, no session or session was closed

我已经在WEB.XML里面加入了OpenSessionInViewFilter了呀,WEB浏览器报的错误又是
org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.bzu.entity.Student.courses, no session or session was closed

小弟是新手,请假大家了
...全文
231 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
illhan98 2012-07-09
  • 打赏
  • 举报
回复
查询的时候stu = (Student) HibernateUtil.select(clazz, id);
select里面应该要Hibernate.initialize(课程类的集合吧);
要不在外面用stu.getCourses()得到课程类是会报错的,不知道select里面有没有initialize
爱吃回锅肉 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

HibernateUtil.select() 应该使用getCurrentSession()并且不用手动关闭。
[/Quote]
(Student) HibernateUtil.select(clazz, id);使用了懒加载,查询玩学生的信息,学生类里面有课程类,得到课程的信息是时候貌似懒加载没有成功,提示出错
爱吃回锅肉 2012-07-09
  • 打赏
  • 举报
回复
学生类
public class Student {

private int id;

private String idCard;

private String password;

private String name;

private int sex;

private String major;

private String birthday;

private String photopath;

private int version;

private Set<Course> courses=new HashSet<Course>();


@Override
public String toString() {
return "Student [birthday=" + birthday + ", courses=" + courses
+ ", id=" + id + ", idCard=" + idCard + ", major=" + major
+ ", name=" + name + ", password=" + password + ", sex=" + sex
+ "]";
}

public Student() {
super();
}

public Student(String idCard, String name, int sex, String major,
String birthday) {
super();
this.idCard = idCard;
this.name = name;
this.sex = sex;
this.major = major;
this.birthday = birthday;
}


public int getVersion() {
return version;
}

public void setVersion(int version) {
this.version = version;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getIdCard() {
return idCard;
}

public void setIdCard(String idCard) {
this.idCard = idCard;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getSex() {
return sex;
}

public void setSex(int sex) {
this.sex = sex;
}

public String getMajor() {
return major;
}

public void setMajor(String major) {
this.major = major;
}



public String getBirthday() {
return birthday;
}

public void setBirthday(String birthday) {
this.birthday = birthday;
}

public Set<Course> getCourses() {
return courses;
}

public void setCourses(Set<Course> courses) {
this.courses = courses;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getPhotopath() {
return photopath;
}

public void setPhotopath(String photopath) {
this.photopath = photopath;
}



}
爱吃回锅肉 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
帮你找了下 Java code

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为fal……
[/Quote]
既然默认是TRUE,那么我根本不需要设置这个参数啊
出错的地方已经说明了,根据学生ID查询出学生信息的时候没有错,stu.getCourses();执行完毕就出错了
噢噢噢噢 2012-07-09
  • 打赏
  • 举报
回复
HibernateUtil.select() 应该使用getCurrentSession()并且不用手动关闭。
c91s1h8 2012-07-09
  • 打赏
  • 举报
回复

帮你找了下

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>


实在不行楼主自己手动控制用完数据 再关闭session 看一下是哪里有问题呗
爱吃回锅肉 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

no session or session was closed
HibernateUtil 里 查询完了是不是就把session关了
我也是新手 你看下吧 我也不知道是不是
[/Quote]
是的,所以用OpenSessionInViewFilter来处理懒加载的问题,不过我的好像没有起作用
c91s1h8 2012-07-09
  • 打赏
  • 举报
回复
no session or session was closed
HibernateUtil 里 查询完了是不是就把session关了
我也是新手 你看下吧 我也不知道是不是
爱吃回锅肉 2012-07-09
  • 打赏
  • 举报
回复
没有人知道吗

67,550

社区成员

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

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