我用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 ......
有人可以告诉我这里我做错了吗?
答案 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
。