Hibernate 动态延迟加载对象不起作用
我在我的项目中使用spring+hibernate;我有两个类Hibernate 动态延迟加载对象不起作用,hibernate,Hibernate,我在我的项目中使用spring+hibernate;我有两个类提醒和客户 在课堂提醒中,我为客户端添加了一个多对一的关系,默认情况下,它是热切加载的。在我的项目中的大多数场景中,我都需要这个对象图,所以我在提醒类中为客户机设置了fetch类型 Class Reminder { @ManyToOne Client client; } 但是对于一两个场景,我想让这个对象客户机的初始化保持惰性 所以我添加了如下获取提醒的方法 Criteria c = session.createCr
提醒
和客户
在课堂提醒中,我为客户端添加了一个多对一的关系,默认情况下,它是热切加载的。在我的项目中的大多数场景中,我都需要这个对象图,所以我在提醒类中为客户机设置了fetch类型
Class Reminder {
@ManyToOne
Client client;
}
但是对于一两个场景,我想让这个对象客户机的初始化保持惰性
所以我添加了如下获取提醒的方法
Criteria c = session.createCriteria();
c.setFetchMode("client", FetchMode.SELECT);
hibernateTemplate.findByCriteria(criteria);
它不起作用;它仍然加载带有提醒的客户端对象
而反向(从懒惰到渴望)在api文档中运行良好:
公共静态最终获取模式选择
Fetch eagerly, using a separate select. Equivalent to fetch="select"
好吧,如果映射被标记为惰性,您可以使用条件或HQL查询急切地获取,但您不能做相反的事情:如果映射被标记为急切地获取,那么它将始终被急切地获取。我认为您不能对可能为null(多对一,一对一)的单端关联进行延迟加载。Hibernate3支持使用一些字节码来延迟加载单个字段 来自JBoss wiki: 在和映射上使用
lazy=“true”
on可以延迟加载单个标量值类型的属性(这种情况有些奇怪)。需要编译的持久类的字节码插装,以注入拦截代码。可以在HQL中使用FETCH ALL属性重写
对单值关联使用lazy=“no proxy”
,以便在不使用代理的情况下启用延迟获取。需要字节码指令插入拦截代码
谢谢。谢谢您的回复;但我在网上发现FetchMode.Select的api文档是错误的;它延迟抓取文档是正确的,抓取意味着我们如何加载数据,而延迟的对/错则是我们是否加载数据。谢谢,但这也不是为了一个多月的关联;我试过了;它不工作,你能不能给我一些字节码的例子代码,让我看看这个链接。