动态延迟加载对象不起作用

时间:2011-06-16 07:41:51

标签: hibernate

我在项目中使用spring + hibernate;我有两个课程ReminderClient 在课堂提醒我已经为客户添加了多对一的关系,默认情况下它是急切加载的。我希望这个对象图在我的项目中的大部分场景中,所以我在提醒类中设置了对客户端渴望的提取类型

Class Reminder {
    @ManyToOne
    Client client;
}

但是对于一个或两个场景我想保持这个对象客户端懒惰的初始化;

所以我在添加提醒的方法中添加了如下所示

Criteria c = session.createCriteria();
c.setFetchMode("client", FetchMode.SELECT); 
hibernateTemplate.findByCriteria(criteria);

它不起作用;它仍然使用提醒加载客户端对象

反向(从懒惰到渴望)工作正常

2 个答案:

答案 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"以在不使用代理的情况下启用延迟提取。需要字节码检测来注入拦截代码。

感谢。