【问题标题】:Lazy loading doesn't work - jpa延迟加载不起作用 - jpa
【发布时间】:2011-02-03 21:20:50
【问题描述】:

大家好, 我有三张桌子儿童、宠物和玩具。宠物有一个孩子ID的引用键,玩具有一个狗ID的引用键。 我想加载关于一个孩子和他的宠物的所有数据,但我不想加载玩具数据

@OneToMany(mappedBy = "petEntity", fetch = FetchType.LAZY)
public Set<PetEntity> getPetEntitySet() {
    return petEntitySet;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ChildId", insertable = false, updatable = false)
public ChildEntity getChildEntity() {
    return childEntity;
}

一套玩具也一样。

加载我拥有的数据

List<ChildEntity> list = entityManager.createQuery(
"SELECT c FROM ChildEntity c "+
"LEFT JOIN FETCH c.petEntitySet ",
 ChildEntity.class).getResultList();
    return list;

但是这个东西会加载我所有的数据,而不仅仅是关于孩子和他的宠物的信息。

如何禁止实体管理器仅加载表中的数据,而不是在我不想要的时候进行连接

感谢您的建议

我忘了提到,在这个追逐中,它不仅加载所有数据,而且返回的不仅仅是一个子元素的副本

【问题讨论】:

  • 你认为它为什么会加载所有数据?

标签: jpa select lazy-loading distinct fetch


【解决方案1】:

它加载更多数据的原因是因为您使用了关键字fetch。这将EAGERLY 加载孩子的宠物。 只需删除fetch,就会发生延迟加载。

更新

我知道这实际上是您想要的,因此只需确保在所有相关类中正确覆盖 equals() 和 hashCode(),因为我假设您正在使用 Set。
这样,jpa 就知道如何查找重复项了

第二次更新

是的,您可以在查询中轻松使用DISTINCT。

只需在您的选择中添加DISTINCT

List<ChildEntity> list = entityManager.createQuery(
"SELECT DISTINCT c FROM ChildEntity c "+
"LEFT JOIN FETCH c.petEntitySet ",
 ChildEntity.class).getResultList();
    return list;

【讨论】:

  • 我解决了这个问题,我现在有另一个问题,如果一个孩子有超过 1 个宠物,例如结果列表中的 3 个,我将有 3 个孩子每个有一个宠物,而不是一个有树的 c 个孩子害虫(我正在使用集合),有什么方法可以使用标准的不同根之类的东西?
  • 这个问题的确切解决方案是什么,我遇到了类似的问题。您是否从查询或实体中的注释中删除了“fetch”关键字?
  • 哪个问题?如果它正在加载更多数据,则删除 fetch 并添加 distinct
  • OP 询问的原始问题是,当在某个实体上调用查询时,它会在您不要求的情况下遍历并加载连接中的所有其他数据?
  • 是的。只要确保 equals 和 hashcode 被覆盖,删除 fetch 并使用 distinct。应该是你所需要的一切
猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 2019-09-06
  • 2022-01-09
  • 1970-01-01
  • 2014-03-06
  • 2019-01-18
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多