使用FetchType.lazy防止JPA/Hibernate中的延迟加载(尤其是在使用@Transactional时)



我四处搜索,但只收到了与我问题相反的人的提问。假设我们有:

@Entity
class Book {
...
@ManyToOne(fetch = FetchType.LAZY)
private Author author;
}

JPA/Hibernate中是否有(最好是全局的(属性/方法来防止延迟加载作者(或任何实体(

别误会我的意思,我不想用EAGER获取。我想防止大三学生不小心调用book.getAuthor((.getName((并再次调用DB。很多人都想修复他们的LazyInitializationException,但我基本上想强制抛出这样的异常,即使存在活动会话(使用@Transactional时很容易犯这个错误(。然而,如果你正确地使用";JOIN FETCH作者";在您的JPQL查询中。

我的特殊用例是Spring和GraphQL。@当会话打开时,Transactional非常容易隐藏,并避免了LazyInitializationException。使用GraphQL,您可以指定要获取的字段,这样我就不希望在没有请求此类字段时进行不必要的联接(这里我们使用带有DataLoader的字段解析程序(。

一个足够的解决方法是使用投影吗(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections)没有提及作者的图书实体?通过使用不同的投影来确保相关实体不会被无意加载?

相关内容

最新更新