您的位置:首页 > 其它

Hibernate lazy load

2016-05-04 23:04 225 查看
项目中使用了很多many-to-one的映射,刚开始的时候不加lazy=false会报这个错误


could not initialize proxy - no Session

加上lazy=false确实没有报错了,但是后来做性能测试的时候确确实实为此感到羞耻,因为每次都会有很多无用的sql执行。
下定决心去掉lazy=false,Spring提供了OpenSessionInViewInterceptor和OpenSessionInViewFilter这两种方式实现这个解决方案。其实是一回事,只不过一个是配置在web.xml里面一个是当作bean来配置。但是这种方法性能存在争议。
后来发现在transaction的的声明上加上readOnly=true可以解决这个问题:

@Transactional(readOnly = true)


当然这是加在只读的方法上,需要加在service层,因为它只对当前声明的方法有效,如果实体对象被穿出这个方法则是不行的,看具体业务而定。
再后来发现,其实不加(readOnly = true)也行,但是要声明事务。我想这是保证在同一个session里面。
问题的症结就在于你的程序如何管理当前的session,这和你的事务传播机制有关,如果能够保证这个对象一直在同一个Session中则没有问题。
非要把这个对象传出当前session的时候怎么办呢?可以借用Hibernate的初始化方法,手动进行初始化:
Hibernate.initialize(proxy);


Hibernate的使用很多时候要看具体业务去采取优化的方式,了解源码懂得它的原理就不怕不知道怎么用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: