论坛首页 入门技术论坛

lazy加载问题

浏览 3709 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-05-11  
一个parent/child模型中,clientt端定义了many-to-one,在parent端设置one-to-many,双方都设置了lazy加载。
通过HibernateTemplate.get方法得到实体,那么实体中的延迟加载部分是一个proxy。
问题如下
  1. 在get方法后,session已关闭,通过什么方式不使org.hibernate.LazyInitializationException到处蔓延;
  2. 如果不希望proxy对象延伸到表现层和service层,那么要如何处理;
  3. 如果在表现层和service层访问client.getParent(),要返回一个parent对象,其中只有代理主键有赋值,那么要怎么处理;
  4. 如果在表现层和service层访问parent.getChildren(),要得到一个size为0的List(不是proxy)要怎么处理。
我目前的做法是:
java 代码
 
  1. Client client = (Client)get(Client.class, id);      
  2. if (client == nullreturn null;      
  3.       
  4. if (client.getParent() != null)      
  5.    client.setParent(new Parent(client.getParent().getId()));      
  6.       
  7. return client;     
  8.     
  9.     
  10. Parent parent = (Parent)get(Parent.class, id);    
  11. if (parent == nullreturn null;    
  12.     
  13. parent.setChildren(new ArrayList<Child>());    
  14. return parent;    
这种做法并不是很优雅,如果是用find()方法,还需要对结果集进行遍历设置,非常麻烦。
请高手赐教!
   发表时间:2007-05-11  
1、看看你的这行代码,是个BUG:

if (client.getParent() != null)       
   client.setParent(new Parent(client.getParent().getId()));       

parent.setChildren(new ArrayList());  也类似

2、不是很清楚你问的问题,但可能你需要用SessionInView模式

3、看Hibernate Reference非常关键!
0 请登录后投票
   发表时间:2007-05-11  
Qieqie 写道
1、看看你的这行代码,是个BUG:

if (client.getParent() != null)       
   client.setParent(new Parent(client.getParent().getId()));       

parent.setChildren(new ArrayList());  也类似

2、不是很清楚你问的问题,但可能你需要用SessionInView模式

3、看Hibernate Reference非常关键!


这段代码并没有错client.getParent()返回的是一个proxy,这个proxy可以得到代理主键。上述代码的意图是用proxy中的代理主键构建一个Parent对象,那么在service层或表现层访问时,就不会遇到LazyInitializationException。

引用
2、不是很清楚你问的问题,但可能你需要用SessionInView模式
如果仅仅只是做DAO的单元测试,那么要SessionInView模式要怎么用,如果不web应用程序,又该怎么处理。
0 请登录后投票
   发表时间:2007-05-11  
呵呵。 不是BUG,也需要改!
0 请登录后投票
   发表时间:2007-05-11  
Qieqie 写道
呵呵。 不是BUG,也需要改!

怎么改,有没有解决方案。
0 请登录后投票
   发表时间:2007-05-11  
我的问题关键是如何防止LazyInitializationExceptionproxy到处蔓延,使用Session In View模式是一种解决方案,是否还存在其它方案?
0 请登录后投票
   发表时间:2007-05-11  
真不想回答这个帖子呀
如果你在入门板块发表,我回答的兴趣就大了
0 请登录后投票
   发表时间:2007-05-11  
Qieqie 写道
真不想回答这个帖子呀
如果你在入门板块发表,我回答的兴趣就大了

如果你是在这装牛人的话,那就太没品味了!
0 请登录后投票
   发表时间:2007-05-11  
如果不用open session in view的话,你需要在你的service上配interceptor,自己做session的打开和关闭操作来模拟open session in view,这样就不用考虑LazyInitializationException了,如果数据还需要在表现层使用,可以使用原始的hibernate.initialize
0 请登录后投票
   发表时间:2007-05-11  
kof99th 写道
如果不用open session in view的话,你需要在你的service上配interceptor,自己做session的打开和关闭操作来模拟open session in view,这样就不用考虑LazyInitializationException了,如果数据还需要在表现层使用,可以使用原始的hibernate.initialize

这么做的话,表现层就和dao层(Hibernate)有了耦合,虽然大部分项目不会轻易更换dao的实现,但这种实现方法并不是很好,而且要求dao的接口甚至service的接口必须做出明确的说明。
0 请登录后投票
论坛首页 入门技术版

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