首页 > 代码库 > 延迟加载和session关闭的矛盾
延迟加载和session关闭的矛盾
延迟加载(no session or session was closed)就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。
那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢?
其实很简单,它使用了代理机制。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用getter方法时就会去数据库加载数据。
但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。这种情况就叫做未初始化的关系。
延迟加载与session关闭的矛盾一般可以这样处理:
1.使用迫切加载:
FetchType.EAGER:加载一个实体时,定义急加载的属性会立即从数据库中加载。
2.在 session 关闭之前先获取需要查询的数据(Hibernate.initialize()方法)。
3.使用拦截器(Interceptor)或过滤器(Filter)控制 Session。
例如:
- <!-- Spring的OpenSessionInView实现 -->
- <filter>
- <filter-name>openSessionInViewFilter</filter-name>
- <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
- </filter-class>
- <!-- singleSession默认为true,若设为false则等于没用OpenSessionInView 。所以默认可以不写-->
- <init-param>
- <param-name>singleSession</param-name>
- <param-value>true</param-value>
- </init-param>
- <!--
- 指定org.springframework.orm.hibernate3.LocalSessionFactoryBean在spring配置文件中的名称,默认值为sessionFactory。 如果LocalSessionFactoryBean在spring中的名称不是sessionFactory,该参数一定要指定,否则会出现找不到sessionFactory的例外。所以默认可以不写
- -->
- <init-param>
- <param-name>sessionFactoryBean</param-name>
- <param-value>sessionFactory</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>openSessionInViewFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
延迟加载和session关闭的矛盾
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。