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:完成,对不起。我最初应该添加它。Foo2
和 Foo3
都被标记为 EAGER。我认为您看到的是List<Foo2> list
的代理。您能否启用show_sql
并检查查询是否被触发以获取 EAGER 关系?
@MadhusudanaReddySunnapu:再次抱歉,被代理的是 Foo2 的 obj 属性。无论如何,你的建议是一个很好的观点。我们将尝试它,因为它也适用。谢谢。
【参考方案1】:
我们修复了调用 entityManager.unProxy
的问题,但仍然感觉不对,因为映射设置为 EAGER,它应该已经取消代理。
【讨论】:
理想情况下应该加载 EAGER 集合。您是否有机会检查查询是否被触发以获取 EAGER 关系? @MadhusudanaReddySunnapu:在这种情况下不会触发查询。 @MadhusudanaReddySunnapu:当然这是一个简化的例子,真实的实体(Foo3)有一个复杂的依赖树。我不确定这是否会产生影响。以上是关于Hibernate 返回设置为 EAGER 的对象的代理的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate CollectionOfElements EAGER 获取重复元素
Hibernate EAGER fetch 和 cascade-type all 有啥区别
EAGER 和分页:Spring MVC + JPA Repository + Hibernate