could not initialize proxy - no Session

hbm.xml<one-to-onename="user"constrained="true"outer-join="true"class="com.biz.coreus... hbm.xml
<one-to-one name="user" constrained="true" outer-join="true"
class="com.biz.coreuser.domain.User" lazy="false" />
错误:
2011-1-4 20:10:08 org.apache.catalina.core.ApplicationDispatcher invoke
严重: Servlet.service() for servlet jsp threw exception
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:191)
at com.eapsoft.biz.bolg.domain.Bolg_$$_javassist_19.getUser(Bolg_$$_javassist_19.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:974)
at org.apache.jsp.jsp.bolg.bolgMessage.messageIndex_jsp._jspx_meth_c_005fforEach_005f0(messageIndex_jsp.java:384)
at org.apache.jsp.jsp.bolg.bolgMessage.messageIndex_jsp._jspService(messageIndex_jsp.java:308)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:332)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:671)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:462)

查询方法:
(Bolg) getSession().createSQLQuery("SELECT * FROM BOLG WHERE USER_ID = " + userId).addEntity(Bolg.class).list().get(0)
那我到底是lazy=false呢还是?
展开
 我来答
ondip78
2011-01-04 · TA获得超过8999个赞
知道小有建树答主
回答量:1798
采纳率:0%
帮助的人:912万
展开全部
hibernate3中出现 could not initialize proxy - no Session 错误的解决办法以及lazy load的介绍 could not initialize proxy - no Session
异常:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)

原因:hibernate3 many-to-one的默认选项是 lazy = "proxy"
解决方法:<many-to-one> & <set> 中设置 lazy="false"

HIBERNATE的持久化对象加载策略。
延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.org并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

比如在我们的应用中,user->post形成一对多的映射,User中有一个包含post的List。
在User中,有多个属性:name,password,phone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。
解决办法是在close session之前,调用Hibernate.initialize(user.getPosts()),告诉系统,user.getPosts()是需要lazy laoding的。但是这样做会破坏HibernateSession类的封装.
后来采用所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个session,response结束之后再关闭它,这样可以让session存在于整个请求周期中。

Hibernate中Lazy延迟加载
Hibernate有关one-to-one和many-to-one在查询中的父亲端lazy问题
Hibernate3在关联上有lazy这个属性,如果是Hibernate2,应该是设置outer-join="false",然后被关联的对象,在class那个地方设置lazy="true".首先,对于many-to-one的问题,可以在父亲端的class标签中设置lazy来解决,这样,在查询儿子的时候,不会发送多余的sql .
对于one-to-one,在hibernate2里面,由于one-to-one里面没有lazy的选项,所以只能通过设置outer-join="false"来解决。而hibernate3已经加入了lazy,所以不会有这个问题。
总体来说,如果你发现你查询儿子的时候,有多余的sql发送,那一定是你对hibernate的误用..

在hibernate 的one-to-many,many-to-one,many-to-many中,为了效率的提高,我们一般都采用lazy机制,但使用spring的getHibernateTemplate().save(Object)时,HibernateTemplate试图每次在execute之前去获得Session,执行完就力争关闭Session 。也就是说Hibernate的Lazy初始化1:n关系时,你必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出Failed to lazily initialize a collection - no session or session was closed的例外。

Hibernate中的对象的关联(association)的设置还是不够灵活,实际应用中有的地方需要lazy load,有的地方又不需要,其实还有的地方就根本不需要使用association。而在Hibernate中,只能在影射文件中设置一种方式,像我们这样的应用,我是不敢轻易使用open session in view的(慢点总比lock住要好),只能是要么不设置association,要么就是lazy=true的。以前的分类信息只用了一个many to one的关系,代价还可以忍受,但现在关系越来越复杂了,再多加几个的话,所要付出的performance,带宽等方面的代价恐怕就不能忽略了,即使使用cache提高一点performance,对带宽的浪费也还是不可原谅的。
zp840566233
2011-01-05 · TA获得超过134个赞
知道答主
回答量:87
采纳率:0%
帮助的人:42.3万
展开全部
楼主如果是想问lazy的话,我建议你在class配置lazy=false,如果问上面的错误的话,需要贴代码了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sunh_qbear
2011-01-05 · TA获得超过111个赞
知道答主
回答量:147
采纳率:0%
帮助的人:0
展开全部
共享主键的问题对延迟加载好像没什么要求,一般设置为FALSE就可以
刚刚在晚上看了一篇关于延迟加载的文章你可以去看看
http://xhf210.blog.163.com/blog/static/6754873820093204115954/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
代码更疯狂
2011-01-05 · 超过19用户采纳过TA的回答
知道答主
回答量:58
采纳率:0%
帮助的人:20.9万
展开全部
楼下的长篇大论,都是COPY的吧!
程序出错很正常,调试的时候找出错原因最重要,依照LZ的出错信息来看,
异常是JSP页面抛出来的,也就是说在编译JSP时候出错,推断应该是在JSP中调用了查询出来的实例关联的实体类,而这个关联的实体类却没有加载进来,LZ查看下代码,另外,LZ把关联的另一个实体类的配置信息也发出来,这样好找解决办法
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
身众页O
2018-06-26
知道答主
回答量:7
采纳率:0%
帮助的人:6020
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式