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/