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

标签 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 属性成员: 自定义DDL字段 这不是代理!

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

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

最佳答案

看看this answer .

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

这是期望的行为,因为它确保在所有情况下都使用相同的对象实例,只要对象是托管的。

关于java - Hibernate 从同一个请求返回同一个实体,但在一种情况下它被代理,而在第二种情况下它不是。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065118/

相关文章:

java - Java Spring mvc 中的 Angular Js 发布日期错误请求

java - 使用 Java 的 volatile 关键字的不一致

java - findViewById() 无法在我的自定义适配器中解析

java - 瓷砖定义解释。 .* 和 {1} 有什么作用?

java反射superClass被hibernate加载的问题

java - 按元素的多个属性过滤集合 - QueryDSL

c# - 对继承类的最小起订量测试总是返回 null

hibernate - Spring引导和Spring数据: how are Hibernate Sessions managed?

javascript - JavaScript 中的对象继承

c++ - 在 C++ 中通过析构函数销毁动态数组的 vector