【问题标题】:Prevent Hibernate from returning a proxy in my criteria阻止 Hibernate 在我的条件中返回代理
【发布时间】:2016-02-18 17:52:06
【问题描述】:

这是我的标准:

public Commercial findManager(Entity entity) {
    DetachedCriteria criteria2 = DetachedCriteria.forClass(Role.class);
    criteria2.createAlias("workStation", "workStation");
    criteria2.createAlias("workStation.entity", "entity");
    criteria2.add(Restrictions.eq("entity.id", entity.getId()));
    criteria2.createAlias("commercial", "commercial", CriteriaSpecification.LEFT_JOIN);
    criteria2.setFetchMode("commercial", FetchMode.JOIN);
    criteria2.createAlias("commercial.function", "function");
    criteria2.add(Restrictions.eq("function.name", "MANAGER"));
    criteria2.setProjection(Projections.property("commercial"));
    Commercial commercial = (Commercial) getHibernateTemplate().findByCriteria(criteria2).get(0);
    return commercial;
}

此条件按预期工作,只是它返回一个代理。由于我要查询该代理上的许多属性,我想强制休眠在同一个查询中加载该对象,但即使在 JOIN 模式下使用 fetchmode,它似乎也不起作用。怎么了?

我使用休眠 3.3.2 和 spring 2.5

【问题讨论】:

  • 您确定返回的实例虽然是代理,但没有初始化?看看这个answer
  • 您说得对,在查看了您的建议并进行了进一步调查后,我发现代理实际上是如何初始化的。

标签: java hibernate proxy


【解决方案1】:

感谢 Dragan,我发现代理实际上已初始化。这实际上是对我在 JDBC 日志和调试器中看到的内容的错误解释。

我看到了这个:

但是当深入研究时,我发现数据在那里,并且将数据记录到控制台中并没有触发对数据库的新调用:

经过更多调查,我发现原始请求中的FetchMode.JOINCriteriaSpecification.LEFT_JOIN 实际上不需要得到这个结果。但是 Adress 字段是一个复杂的对象,它没有被初始化,并且查询它的属性会产生对数据库的新请求。然后我尝试添加以下行,现在它就像一个魅力(就像在上一个屏幕截图中我们可以看到地址字段是一个代理一样)

    criteria2.setFetchMode("commercial.adresse", FetchMode.JOIN);

【讨论】:

    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多