该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-10-15
对于一些简单的应用,这中架构是足够的。但是对于复杂的应用,一个object中有许多的引用对象,如果一次将他们全load到内存中,很吃不消,所以最好是使用lazy initialization,但是因为我每次都开关session,好像对象的引用关系保存在session中,关闭了session。换一个session来load 老的对象就不能实现lazy initialization。 如果一定要对某个object只能用同一个session来load,该如何实现呢。假设所有的应用只用一个session,性能肯定会下降。不知道我的理解正不正确,该如何解决请指教,谢谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-10-15
刚才说的不太清楚,
应该是在老的session load一个对象到自定义的cache后,使用这个对象就不能再调用lazy initialization 的引用了。 |
|
返回顶楼 | |
发表时间:2003-10-15
那你只把需要引用到的对象initialize一下就行了。
Hibernate.initialize() |
|
返回顶楼 | |
发表时间:2003-10-15
hibernate的文档
In an application with a seperate business tier, the business logic must "prepare" all collections that will be needed by the web tier before returning. Usually, the application calls Hibernate.initialize() for each collection that will be needed in the web tier (this call must occur before the session is closed) or retrieves the collection eagerly using a query with a FETCH clause. 这样用会出错的, 我的意思简单的说就是怎样跨session,lazy initialization. 谢谢! ps: 我订阅了这个主题,为什么你回复我收不到mail,thanks |
|
返回顶楼 | |
发表时间:2003-10-15
跨Session进行lazy loading是做不到的。实际上也不需要进行跨Session的lazy loading。因为用户界面是二维的,不可能同时既显示对象信息列表的同时,又把对象相关对象的信息显示出来,除非三维界面才能做到。
只能是在一个界面里面显示对象信息列表,在另一个界面显示某对象的相关对象信息。所以你要么用不到lazy loading,要么只是针对某个对象进行lazy loading,此时在Session关闭前initialize一下就OK了。 因此我想不到需要跨Session进行lazy loading的理由,除非计算机什么时候有了三维界面才需要吧。 邮件通知功能我cancel掉了。我安装论坛的时候用的是cnphp小组enhance过的phpBB2.0.4,叫做phpBB2.0.6mod娱乐版的测试版,结果运行以后才发现不少bug,我自己改了一些。邮件通知bug我曾经改过,但是没有改掉这个bug,只好cancel了。 |
|
返回顶楼 | |
发表时间:2003-10-15
如果一个playboy对象中包含几个引用
一个是wife数组 一个是lover数组 (很多人的梦想啊) 因为wife,lover都是很耗资源的东东(要花很多时间去讨好:-) ),所以如果再load playboy的时候将她们都load进来系统资源会不够,所以采用lazy load,约会lover时load lover对象,回家时load wife对象。但是处理玩 lover对象后这个session已经commit,而且为了做到模块化隔离,所以把session也关闭了。处理wife时是另一个session。(这叫见不同人说不同话)这时我想lazy load wife就失败了。 请大家分析一下,这个需求是不是很充分,该怎样满足,谢谢。 例子很搞笑,但是确实有实例的需求。非常感谢 |
|
返回顶楼 | |
发表时间:2003-10-15
这种情况请使用Hibernate Design Patterns里面的“Lightweight Class”模式。
详情可见hibernate.org上的相关文档。 BTW,你的例子很cool,我以后写相关内容的文章会引用 |
|
返回顶楼 | |
发表时间:2003-10-15
flosed 写道 如果一个playboy对象中包含几个引用
一个是... 在你的取getPlayboy()方法附加两个参数: boolean loadWife, boolean loadLover 方法里面根据参数进行initialize不就行了? |
|
返回顶楼 | |
发表时间:2003-10-15
如果我有很多类似wife,和lover一样的层次东东,
如parent,friend等 那按照lightweight pattern,我要为每一个,playboy-wife,playboy-lover 配对做一个子类,这样代价是不是太大了点。 我有一个想法,能不能保存一个playboy-session 的map,当发现playboy的请求,先检查他有以前有没有load过,如果没有,从sessionFactory中取一个session load他,同时保存这个playboy-session到map,下次再收到这个playboy的请求,会直接从map中取,而不是从sessionFactory中取,当然这要求永不关闭session。只能定期flush一下。 不知道是否可行,能否先从理论上帮忙认证一把。 (我看了hibernate源码中,PersistentCollection和proxy其实都保存了session ,而且会检查session是否关闭。) |
|
返回顶楼 | |
发表时间:2003-10-15
因为playboy很花心,他不是仅仅初始化之后玩会就算了,
他陪了lover再陪wife,之后又偷空去陪lover 关键是初始化之后要在另一个session中再初始化一个collection |
|
返回顶楼 | |