gpt4 book ai didi

hibernate - Fetch Type LAZY 仍然导致 Eager 加载 Hibernate Spring 数据

转载 作者:行者123 更新时间:2023-12-03 08:08:09 24 4
gpt4 key购买 nike

我用 Spring 数据创建了一个简单的 Spring boot 项目。

我有一个 TagGroup 实体,它与标签有一对多的关系。

 @Entity
@Table(name = "TAG_GROUP")
public class TagGroup{

@OneToMany(fetch=FetchType.LAZY,mappedBy = "tagGroup")
private Set<Tag> tagList;

}

标签实体如下
  @Entity
@Table(name = "TAGS")
public class Tag {

@ManyToOne(optional = false,fetch=FetchType.LAZY)
@JoinColumn(name = "TAG_GROUP_ID")
private TagGroup tagGroup;

}

我正在使用 Spring 数据扩展 JPArepository 并使用它的 findAll 方法。

问题是,Lazy fetch 不起作用,但事实上它正在加载标签列表,也没有显式调用 tagList,因为如果它是 EAGER...

谁能告诉我我在这里做错了什么?

最佳答案

这是因为属性(property)spring.jpa.open-in-view=true .

根据 spring-boot-configuration Spring 启动应用程序使用 spring.jpa.open-in-view=true .

有了这个属性

Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request.



因此,在您的情况下,随后当您调用 getTagList() 时即,检索 tagList ,它随后触发另一个查询以获取 tagListEntityManager仍然开放。

您可能知道, LazyInitializationException如果 entityManager 永远不会抛出已加载父项仍处于打开状态。

要覆盖它,您可以添加 spring.jpa.open-in-view=false在您的 application.properties/application.yml然后你应该看到 LazyInitializationException .

关于hibernate - Fetch Type LAZY 仍然导致 Eager 加载 Hibernate Spring 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36282018/

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