Hibernate 返回设置为 EAGER 的对象的代理

Posted

技术标签:

【中文标题】Hibernate 返回设置为 EAGER 的对象的代理【英文标题】:Hibernate returns a proxy for an object set to EAGER 【发布时间】:2016-03-29 08:33:24 【问题描述】:

我们正在使用我们开发的一组网络服务。

其中一项服务使用 JPA 映射从某些表中检索信息。 Hibernate 返回一个对象,它按预期工作。

其他服务检索一个非常相似的对象,它返回一个代理而不是读取对象。 fetch 设置为 EAGER,所以我真的不明白为什么会发生这种情况。我们尝试了几种方法将代理转换为真实数据(我知道这是不必要的,因为它设置为 EAGER),但代理没有得到转换。

我们正在使用 hibernate 3.5.4-final 以防万一。

我真的不知道从哪里开始,有什么提示吗?

@Entity
public class Foo1

    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL)
    private List<Foo2> list = new ArrayList<Foo2>();


@Entity
public class Foo2

    @ManyToOne(fetch = FetchType.EAGER)
    private Foo3 obj;

检索我们调用的数据:

entityManager.find(Foo1.class, id);       

我的一个想法是,也许 Hibernate 正在管理一个内部异常,这就是为什么我得到一个代理而不是真实对象?

编辑 这是与问题相关的Hibernate配置:

<property name="hibernate.max_fetch_depth" value="0"/>
<property name="hibernate.default_batch_fetch_size" value="16"/>
<property name="hibernate.jdbc.batch_size" value="16"/>

【问题讨论】:

您能否发布该实体类以及如何获取该实体。 @MadhusudanaReddySunnapu:完成,对不起。我最初应该添加它。 Foo2Foo3 都被标记为 EAGER。我认为您看到的是List&lt;Foo2&gt; list 的代理。您能否启用show_sql 并检查查询是否被触发以获取 EAGER 关系? @MadhusudanaReddySunnapu:再次抱歉,被代理的是 Foo2 的 obj 属性。无论如何,你的建议是一个很好的观点。我们将尝试它,因为它也适用。谢谢。 【参考方案1】:

我们修复了调用 entityManager.unProxy 的问题,但仍然感觉不对,因为映射设置为 EAGER,它应该已经取消代理。

【讨论】:

理想情况下应该加载 EAGER 集合。您是否有机会检查查询是否被触发以获取 EAGER 关系? @MadhusudanaReddySunnapu:在这种情况下不会触发查询。 @MadhusudanaReddySunnapu:当然这是一个简化的例子,真实的实体(Foo3)有一个复杂的依赖树。我不确定这是否会产生影响。

以上是关于Hibernate 返回设置为 EAGER 的对象的代理的主要内容,如果未能解决你的问题,请参考以下文章

[Hibernate] - EAGER and LAZY

Hibernate CollectionOfElements EAGER 获取重复元素

Hibernate EAGER fetch 和 cascade-type all 有啥区别

EAGER 和分页:Spring MVC + JPA Repository + Hibernate

使用 JPA 在 Hibernate 中使用 EAGER 类型进行多次提取

Sequelize Eager Loading - 返回更扁平的数据对象