关于懒加载的问题,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

小弟是新手,请假大家了
...全文
307 9 打赏 收藏 举报
写回复
用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
  • 打赏
  • 举报
回复
没有人知道吗
源码直接下载地址: https://pan.quark.cn/s/387d7c8f6289 在使用IE浏览器的过程中,偶尔会出现重置为默认配置操作未能顺利完成的现象。这种情况的发生可能源于多种因素,包括注册表项出现偏差、浏览器附加组件之间存在不兼容、操作系统授权设置不当或受到恶意程序影响等。针对这一挑战,我们可以通过一系列系统性的方法来逐一诊断和纠正。首先需要验证当前用户是否具备管理员级别的操作权限。在执行重置配置的操作时,必须确保IE浏览器是以管理员身份启动的。具体操作方式为,使用鼠标右键单击IE程序图标,并从弹出的菜单中选择“以管理员身份运行”这一选项。其次,应当检查是否存在恶意软件。恶意程序有时会非法修改浏览器的配置信息,从而阻碍重置过程的正常进行。用户可以借助Windows系统自带的Microsoft Safety Scanner进行检测,或者选择安装并使用第三方安全防护软件执行全面的系统扫描。紧接着,需要对浏览器的缓存数据以及Cookies文件进行清理。在IE浏览器界面中,通过访问“工具”菜单并选择“Internet选项”,然后在弹出的设置界面中,切换至“常规”标签页,并执行清除浏览历史记录的操作,此过程应包含Cookies和临时互联网文件。倘若上述步骤均未能解决问题,那么可以考虑禁用或移除那些可能引发冲突的浏览器附加组件。相关操作需要在“工具”菜单下找到并打开“管理加载项”,对可疑的插件进行禁用处理,并在浏览器重新启动后再次尝试执行重置操作。再者,修复IE浏览器相关的注册表配置也是至关重要的环节。注册表编辑器是一个功能强大的系统工具,任何不当的操作都可能导致严重的系统问题,因此在进行修改前必须创建系统还原点作为安全备份。用户可以通过按下“Win+R”组合...
内容概要:本文详细介绍了光伏储能虚拟同步发电机(VSG)并网仿真模型的Simulink实现方法,系统研究了光伏发电与储能系统融合VSG技术并入电网的动态特性与控制策略。通过构建完整的VSG控制模块,模拟其在并网过程中的虚拟惯性响应、频率调节能力和有功无功功率支撑特性,验证了该系统在增强电网稳定性、提升新能源并网适应性方面的有效性。模型全面涵盖光伏出力特性、储能系统充放电管理、VSG有功-无功解耦控制、下垂控制机制以及并网点动态响应等关键环节,并通过多种工况下的仿真分析,评估系统在不同运行条件下的动态性能与鲁棒性。; 适合人群:具备电力系统、新能源发电、自动控制等相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制或电力电子系统研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①深入理解光伏储能系统如何通过VSG技术模拟同步发电机的惯性和阻尼特性以支持电网稳定;②掌握虚拟惯量控制、下垂控制等VSG核心控制策略在Simulink中的建模、参数设计与实现方法;③为新型电力系统中新能源并网的动态仿真、稳定性分析及控制策略优化提供可靠的模型基础和技术参考。; 阅读建议:建议结合所提供的仿真模型进行逐步操作与参数调试,重点关注VSG控制环路的结构设计、控制器参数整定及其对系统动态性能的影响,同时可将该模型拓展应用于多机并联、微电网孤岛/并网切换、多能源协同控制等更复杂的系统场景中进行进阶研究。

67,535

社区成员

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

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