Hibernate从同一个请求中返回相同的实体,但在一种情况下它是代理的,在第二种情况下它不是。为什么?

时间:2017-05-19 08:32:01

标签: java hibernate inheritance proxy

Hibernate从同一个请求中返回相同的实体,但在一种情况下它是代理的,在第二种情况下它不是。为什么它有时代理,有时不代理?

我有一个hibernate查询:

    String q = "From EntityCustomFields as ecf "
            + "left outer join fetch ecf.customFields "
            + "where ecf.fleetId=:fleetId and ecf.entityType=:et";

    Query query = s.createQuery(q);
    query.setInteger("fleetId", fleetId);
    query.setString("et", et.toString());
    EntityCustomFields res = (EntityCustomFields) query.uniqueResult();

res 变量中,我得到一个 EntityCustomFields 对象。

第一种情况:customFields属性包含几个类型为的成员:     的的CustomField _ _ $$ jvste27_9f 这看起来像代理对象,但在请求“fetch”使用,并且我理解hibernate不应该代理使用eager fetch。正确?

在第二种情况下,我使用et参数的其他值并获取类型为的customFields属性成员:     的 CustomDDLField 这不是代理!

因为我知道在第一种情况下相同的数据库实体被代理但在第二种情况下不是代理,这变得更加奇怪。

一个细节可能很重要,CustomDDLField扩展了CustomField

1 个答案:

答案 0 :(得分:1)

看看this answer

您看到代理的对象可能已经在同一个持久化上下文实例中作为代理加载,因此Hibernate会继续使用它们,直到它们被驱逐或持久化上下文关闭为止。

这是所需的行为,因为只要对象被管理,它就可以确保在所有情况下都使用相同的对象实例。