MyException - 我的异常网
当前位置:我的异常网» J2EE » org.hibernate.LazyInitializationException: could

org.hibernate.LazyInitializationException: could not initialize proxy

www.MyException.Cn  网友分享于:2013-11-26  浏览:2080次
hibernate的延迟加载问题
前几天的问题是不能根据上级部门ID查找下级的部门,删除lib下asm.jar,asm-attrs.jar,cglib-2.1.3.jar后已经能够运行,现在根据下级查找上级部门的ID,又出现了如下的错误:16:14:24,785 ERROR LazyInitializationException:19 - could not initialize proxy - the owning Session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

而且我的web.xml中已经配置了:

<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>
hibernate映射文件中也都配置了lazy=true,可还是不能根据下级部门得到上级的ID,什么原因呢?
我的环境是S2SH

------解决方案--------------------
使用延迟加载对象时其对应的Session不能关闭,游离状态的对象不能初始化
------解决方案--------------------
需要在多对一 或者 一对多 关系的那个xml文件中 增加 lazy="false"
------解决方案--------------------
楼主把lazy="extra" 换成lazy="false"试试
------解决方案--------------------
可能是因为
public Organization findOrg(int id) { 


return (Organization)getHibernateTemplate() 
.load(Organization.class, id); 

这个方法中知识加载了Organization对象。
if(parentId != 0){ 
Organization parent = orgManager.findOrg(parentId); 
在上面这步中parent.getParent()这个对象实际上是没有加载进来的。因为你用了延迟加载。(在调用的时候才加载)
if(parent.getParent() != null){ 
在上面这步中调用parent.getParent(),此时去加载parent对象,但是这时session已经关闭了。所以出错
ppid = parent.getParent().getId(); 


修改方案:在查询数据库的方法中。同时调用关联的对象。使其加载。
public Organization findOrg(int id) {
Organization parent = (Organization)getHibernateTemplate()
.load(Organization.class, id);
parent.getParent();

return parent;



------解决方案--------------------
public class Organization {


private Organization parent;

/**
* @hibernate.set inverse="true" lazy="extra"
* @hibernate.key column="pid"
* @hibernate.one-to-many class="org.myy.model.Organization"
*/
private Set children;//这里需不需要初始化?private Set children = new HashSet()


public Set getChildren() {
return children;
}
public void setChildren(Set children) {
this.children = children;
}
------解决方案--------------------
把这段代码
Java code
public Organization findOrg(int id) { 
return (Organization)getHibernateTemplate() 
.load(Organization.class, id); 
}

------解决方案--------------------
如果上一方法不行
再试试把
Java code
/** 
* @hibernate.set inverse="true" lazy="extra" 
* @hibernate.key column="pid" 
* @hibernate.one-to-many class="org.myy.model.Organization" 
*/ 
private Set children;

------解决方案--------------------
fetch = FetchType.LAZY

 设置查询时候的抓取方式,这个或许才是关键!
------解决方案--------------------
关注
------解决方案--------------------
探讨
可能是因为
public Organization findOrg(int id) {


return (Organization)getHibernateTemplate()
.load(Organization.class, id);

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有