【问题标题】:dynamically lazy loading of objects does not work动态延迟加载对象不起作用
【发布时间】:2011-06-16 07:41:51
【问题描述】:

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

Class Reminder {
    @ManyToOne
    Client client;
}

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

所以我添加了获取提醒的方法如下所示

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

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

虽然反向(从懒惰到急切)工作正常

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    来自 api 文档:

    public static final FetchMode SELECT

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

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

    【讨论】:

    • 感谢回复;但我在网上发现 FetchMode.Select 的 api 文档是错误的;它懒惰地获取
    • doc是正确的,fetching是指我们如何加载数据,而lazy true/false是我们是否加载数据。
    【解决方案2】:

    我认为你不能对可以为空的单端关联进行延迟加载(多对一,一对一)。 Hibernate3 支持使用一些 字节码 延迟加载单个 字段

    来自 JBoss wiki:

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

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

    谢谢。

    【讨论】:

    • 谢谢,但它也不适用于 oneToMany 关联;我试过了;它不工作,你可以给我延迟初始化的字节代码示例代码
    • JBoss查看此链接。
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多