假设我有2个实体,EntityA和EntityB
EntityB与EntityA相关@OneToOne
:
@Entity
public class EntityB {
@OneToOne(fetch = FetchType.LAZY)
private EntityA entA;
// other stuff
}
当我从DB加载EntityB时,相应的EntityA(比如 entA1 )是延迟加载的。
之后我按
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)我可以完全加载代理实体还是完全加载所有这些实体?没有混合。
答案 0 :(得分:1)
是的,这是预期的行为。 Hibernate尽其所能在会话中拥有一个且只有一个实体实例。由于它已经有EntityA的代理,当您加载EntityB时存储在会话中,后续查询返回相同的EntityA实例有效地返回相同的实例:已存储在会话中的代理。
您不应该太在意列表包含代理的事实。在代理上调用任何方法(getClass()
除外)将返回与在未代理实体上调用它相同的内容。
AFAIK,即使对象甚至没有equals()
方法,也允许实体集合与附加对象一起正常运行。