首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止Hibernate在我的条件中返回代理

防止Hibernate在我的条件中返回代理
EN

Stack Overflow用户
提问于 2016-02-18 17:52:06
回答 1查看 700关注 0票数 2

以下是我的标准:

代码语言:javascript
复制
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;
}

除了返回代理之外,此标准的工作原理是正常的。由于我将在该代理上查询许多属性,所以我希望强制hibernate在同一个查询中加载该对象,但即使在JOIN模式下,它似乎也不起作用。怎么啦?

我使用hibernate 3.3.2和Spring2.5

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 09:55:41

多亏了Dragan,我才发现代理实际上已经初始化了。这实际上是对我在JDBC日志和调试器中看到的错误的解释。

我看到了这个:

但是,当深入研究它时,我发现数据就在那里,在控制台中记录数据不会触发对数据库的新调用:

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

代码语言:javascript
复制
    criteria2.setFetchMode("commercial.adresse", FetchMode.JOIN);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35488843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档