我在项目中使用spring + hibernate;我有两个课程Reminder
和Client
在课堂提醒我已经为客户添加了多对一的关系,默认情况下它是急切加载的。我希望这个对象图在我的项目中的大部分场景中,所以我在提醒类中设置了对客户端渴望的提取类型
Class Reminder {
@ManyToOne
Client client;
}
但是对于一个或两个场景我想保持这个对象客户端懒惰的初始化;
所以我在添加提醒的方法中添加了如下所示
Criteria c = session.createCriteria();
c.setFetchMode("client", FetchMode.SELECT);
hibernateTemplate.findByCriteria(criteria);
它不起作用;它仍然使用提醒加载客户端对象
反向(从懒惰到渴望)工作正常
答案 0 :(得分:2)
来自api doc:
public static final FetchMode SELECT
Fetch eagerly, using a separate select. Equivalent to fetch="select"
AFAIK,如果映射被标记为惰性,您可以使用条件或HQL查询急切地获取,但是您不能反过来:如果映射被标记为渴望,那么它将始终被急切地获取。
答案 1 :(得分:0)
我认为你不能对单端关联进行延迟加载,这种关联可以为null(多对一,一对一)。 Hibernate3使用一些字节代码支持延迟加载单个字段。
来自JBoss wiki:
使用lazy="true"
和映射来启用单个标量值类型属性的延迟加载(有点奇特的情况)。需要使用编译的持久化类的字节码检测来注入拦截代码。可以使用FETCH ALL PROPERTIES在HQL中覆盖。
对单值关联使用lazy="no-proxy"
以在不使用代理的情况下启用延迟提取。需要字节码检测来注入拦截代码。
感谢。