读书人

lazy加载有关问题

发布时间: 2012-11-19 10:18:51 作者: rapoo

lazy加载问题
一个parent/child模型中,clientt端定义了many-to-one,在parent端设置one-to-many,双方都设置了lazy加载。
通过HibernateTemplate.get方法得到实体,那么实体中的延迟加载部分是一个proxy。
问题如下

    在get方法后,session已关闭,通过什么方式不使org.hibernate.LazyInitializationException到处蔓延; 如果不希望proxy对象延伸到表现层和service层,那么要如何处理; 如果在表现层和service层访问client.getParent(),要返回一个parent对象,其中只有代理主键有赋值,那么要怎么处理; 如果在表现层和service层访问parent.getChildren(),要得到一个size为0的List(不是proxy)要怎么处理。
我目前的做法是:if (client.getParent() != null) client.setParent(new Parent(client.getParent().getId()));
parent.setChildren(new ArrayList()); 也类似

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

3、看Hibernate Reference非常关键!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应用程序,又该怎么处理。 3 楼 Qieqie 2007-05-11 呵呵。 不是BUG,也需要改! 4 楼 ant_bug 2007-05-11 Qieqie 写道呵呵。 不是BUG,也需要改!
怎么改,有没有解决方案。 5 楼 ant_bug 2007-05-11 我的问题关键是如何防止LazyInitializationExceptionproxy到处蔓延,使用Session In View模式是一种解决方案,是否还存在其它方案? 6 楼 Qieqie 2007-05-11 真不想回答这个帖子呀
如果你在入门板块发表,我回答的兴趣就大了 7 楼 ant_bug 2007-05-11 Qieqie 写道真不想回答这个帖子呀
如果你在入门板块发表,我回答的兴趣就大了
如果你是在这装牛人的话,那就太没品味了! 8 楼 kof99th 2007-05-11 如果不用open session in view的话,你需要在你的service上配interceptor,自己做session的打开和关闭操作来模拟open session in view,这样就不用考虑LazyInitializationException了,如果数据还需要在表现层使用,可以使用原始的hibernate.initialize 9 楼 ant_bug 2007-05-11 kof99th 写道如果不用open session in view的话,你需要在你的service上配interceptor,自己做session的打开和关闭操作来模拟open session in view,这样就不用考虑LazyInitializationException了,如果数据还需要在表现层使用,可以使用原始的hibernate.initialize
这么做的话,表现层就和dao层(Hibernate)有了耦合,虽然大部分项目不会轻易更换dao的实现,但这种实现方法并不是很好,而且要求dao的接口甚至service的接口必须做出明确的说明。

读书人网 >软件架构设计

热点推荐