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



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

Class Reminder {
    @ManyToOne
    Client client;
}

但对于一两个场景,我希望保持该对象客户端的初始化惰性;

所以我添加了一种提取提醒的方法,就像下面的一样

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

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

而反向(从懒惰到渴望)运行良好

来自api文档:

公共静态最终获取模式SELECT

Fetch eagerly, using a separate select. Equivalent to fetch="select"

AFAIK,如果映射被标记为懒惰,您可以使用条件或HQL查询急切地获取,但不能执行相反的操作:如果映射被标为急切,那么它总是急切地获取。

我认为不能对可能为null(多对一、一对一)的单端关联进行延迟加载。Hibernate 3支持使用一些字节码的东西来延迟加载单个字段

来自JBoss wiki:

在上使用lazy="true",并使用映射来启用单个标量值类型属性的延迟加载(有点奇怪的情况)。需要对已编译的持久类进行字节码检测,以便注入拦截代码。可以在HQL中用FETCH ALL PROPERTIES覆盖。

对单值关联使用lazy="no-proxy"可以在不使用代理的情况下启用延迟获取。需要字节码检测来注入拦截代码。

谢谢。

最新更新