JPA查询返回代理实体

时间:2012-08-02 11:32:51

标签: java hibernate java-ee jpa-2.0 hibernate-4.x

假设我有2个实体,EntityA和EntityB EntityB与EntityA相关@OneToOne

@Entity
public class EntityB {
    @OneToOne(fetch = FetchType.LAZY)
    private EntityA entA;

    // other stuff
}

当我从DB加载EntityB时,相应的EntityA(比如 entA1 )是延迟加载的。
之后我按

加载EntityA列表
   List result = entityManager.createQuery("select A from EntityA A")
                  .setFirstResult(start).setMaxResults(end).getResultList();

结果列表包含以前延迟加载和代理的EntityA以及正常的实体化EntityAs,例如:

EntityA
EntityA_$$_javassist_nnn   <--- entA1 which is loaded lazily earlier
EntityA
...

所以我的问题:
1)这是预期的行为吗?我在哪里可以找到关于它的apidoc信息?
2)我可以完全加载代理实体还是完全加载所有这些实体?没有混合。

1 个答案:

答案 0 :(得分:1)

是的,这是预期的行为。 Hibernate尽其所能在会话中拥有一个且只有一个实体实例。由于它已经有EntityA的代理,当您加载EntityB时存储在会话中,后续查询返回相同的EntityA实例有效地返回相同的实例:已存储在会话中的代理。

您不应该太在意列表包含代理的事实。在代理上调用任何方法(getClass()除外)将返回与在未代理实体上调用它相同的内容。

AFAIK,即使对象甚至没有equals()方法,也允许实体集合与附加对象一起正常运行。