hibernate在什么情况出现延时加载的问题?
在通过关联关系的属性取值时会出现延时加载的问题,例如
多 student 一group的多对一关联,现在查出了一个student,想知道他对应的group ,一般做法是stundent.group.groupName,在这时延时加载就出现了,所谓的延时加载就是查询完后session就关闭了,这时还要继续查找group,而sesion已经关闭,会报错,也就是所谓延时加载,解决发法如下:
1、使用注解配置fetch = FetchType.EAGER,有两个属性,eager是及时加载,lazy是延时加载,这个推荐配置在多的一端,比如配置在student一端
2、使用过滤器来配置
web.xml配置文件以免出现session关闭后延迟加载的问题
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、一次查找时就查找出所有的信息
select s from Student s left join fetch s.teacher
还有,一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations). 查看 第 19.1 节 “ 抓取策略(Fetching strategies) ” 以获得等多的信息。
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens
一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens child
left join fetch child.kittens
假若使用iterate()来调用查询,请注意fetch构造是不能使用的(scroll() 可以使用)。fetch也不应该与setMaxResults() 或setFirstResult()共用,这是因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,也就是说无法预先知道精确的行数。fetch还不能与独立的 with条件一起使用。通过在一次查询中fetch多个集合,可以制造出笛卡尔积,因此请多加注意。对bag映射来说,同时join fetch多个集合角色可能在某些情况下给出并非预期的结果,也请小心。最后注意,使用full join fetch 与 right join fetch是没有意义的。
如果你使用属性级别的延迟获取(lazy fetching)(这是通过重新编写字节码实现的),可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like '%cats%'