gpt4 book ai didi

java - JPA 查询返回代理实体

转载 作者:行者123 更新时间:2023-11-29 05:56:48 29 4
gpt4 key购买 nike

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

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

// other stuff
}

当我从数据库加载 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)我可以只完全加载代理实体还是完全加载所有代理实体?不混合。

最佳答案

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

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

AFAIK,这就是允许实体集合与附加对象正确行为的原因,尽管这些对象甚至没有 equals() 方法。

关于java - JPA 查询返回代理实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11776534/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com