论坛首页 Java企业应用论坛

Tapestry使用OpenSessionInView问题?

浏览 6250 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-01-25  
项目框架:tapestry4.0+hibernate3.0.5+spring1.2.6
由于有延迟加载的我问题,我使用OpenSessionInViewFilter来解决问题!
当我把tapestry自身的页面缓存禁用,OpenSessionInView可以正常使用,但是启用缓存就不能使用,报没有session或session关闭。在发布的时候,不可能禁用缓存,到底是为什么,这个怎么和缓存有关呢?
   发表时间:2006-01-25  
singleSession 设为 true 吧。
0 请登录后投票
   发表时间:2006-01-25  
当然跟缓存有关系了。没用过T4,不过根据原理也可以分析出来

OpenSessionInView是为了lazy load。为什么可以自动的lazy load,因为在整个request-response期间中保持着hibernate的session,hibernate会根据这个session去取lazy的数据。T4的缓存不可能去缓存hibernate的session,自然就出现找不到session的问题了。
0 请登录后投票
   发表时间:2006-01-25  
引用
当然跟缓存有关系了。没用过T4,不过根据原理也可以分析出来

OpenSessionInView是为了lazy load。为什么可以自动的lazy load,因为在整个request-response期间中保持着hibernate的session,hibernate会根据这个session去取lazy的数据。T4的缓存不可能去缓存hibernate的session,自然就出现找不到session的问题了。


应该不会有这个问题.

Open Session in view 是 per request.
0 请登录后投票
   发表时间:2006-01-26  
我也用tapestry4.0+hibernate3.0.5+spring1.2.6,打开页面缓存也没出现这个问题,我没设singleSession,它默认是true.
0 请登录后投票
   发表时间:2006-02-05  
这个是我的demo:http://forum.iteye.com/download.php?id=1598
能帮我看看是什么问题吗?
或者你能写个demo吗?
谢谢!
0 请登录后投票
   发表时间:2006-02-06  
以前用过jdo,现在来用hibernate也老碰上LazyInitializationException这事,基本上也都糊里糊涂的解决了.
你的程序遇到的这个问题在我这儿和tapestry自身的页面缓存没关系,无论页面缓存禁用与否都是:no session or session was closed,从你的程序里看问题是:
public String getTest2();
	{
		Set set = (getVisitState();.getTry1();.getTry2s(););;
		List list = new ArrayList(set);;
		Try2 try2 = (Try2);list.get(0);;
		
		return try2.getTry2name();;
	}

从visit里拿出的对象用的是上个页面的session,是closed,像下面这样用就没问题了
public String getTest2();
	{
		List list1 = (List);getManager();.getObjects(Try1.class);;
		Try1 try1 =  (Try1);list1.get(0);;
		Set set = try1.getTry2s();;
		List list = new ArrayList(set);;
		Try2 try2 = (Try2);list.get(0);;
		
		return try2.getTry2name();;
	}

不知道你的需求是什么样的,我觉得hibernate有两级缓存了,这种对像不用放到visit里,带状态的(跟hibernate相关的)东西放到那里边,不知道要出什么事呢.
0 请登录后投票
   发表时间:2006-02-06  
谢谢gavin
下面这种方法是没有问题的,但是每一次都要多执行一条查询语句,不过现在我也只能这样了,嘿嘿!!!
0 请登录后投票
   发表时间:2006-02-06  
你把你所需要的数据先全部load出来(.getTry2s()), 然后在setVisit里面。
这样就能避免多query一次了。
0 请登录后投票
   发表时间:2006-02-08  
dengyin2000 写道
你把你所需要的数据先全部load出来(.getTry2s()), 然后在setVisit里面。
这样就能避免多query一次了。

这样不就没有使用到lazy loading吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics