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

时间:2016-02-18 17:52:07

标签: java hibernate proxy

这是我的标准:

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模式下使用fetchmode它似乎也不起作用。有什么问题?

我使用hibernate 3.3.2和spring 2.5

1 个答案:

答案 0 :(得分:2)

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

我看到了这个:

Proxy with all fields null

但是当深入研究它时,我发现数据存在,并且在数据控制台中创建日志并不会触发对数据库的新调用:

Proxy actually Initialized

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

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