获取类型LAZY仍导致Eager加载Hibernate Spring数据

时间:2016-03-29 10:41:48

标签: hibernate spring-boot spring-data lazy-loading eager-loading

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

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

 @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 ......

有人可以告诉我这里我做错了吗?

1 个答案:

答案 0 :(得分:2)

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

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

使用此属性

  

注册OpenEntityManagerInViewInterceptor。将JPA EntityManager绑定到线程以进行整个请求处理。

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

如您所知,如果已加载父项的LazyInitializationException仍处于打开状态,则永远不会抛出entityManager

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