【发布时间】: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 属性。无论如何,你的建议是一个很好的观点。我们将尝试它,因为它也适用。谢谢。
标签: java hibernate hibernate-mapping javassist