Spring Data JPA Lazy加载注释为Eager的集合

时间:2013-07-24 16:14:08

标签: java hibernate jpa spring-data-jpa

我有一个项目正在使用Spring Data存储库来自动生成它的一些方法。一种这样的方法是接受一些参数并返回书籍列表的方法。在存储库中,该方法如下所示:

List<Book> findBySellerFlagTrueAndPublishedState(PublishedState state);

但是,当我使用该方法时,似乎hibernate是书籍的延迟加载属性,注释为FetchType.EAGER。另外,当我使用JPA的Criteriabuilder自己构建查询时,我遇到了同样的问题。当我使用默认的findOne(Long id)方法时,会急切地加载这些属性。

我正在使用JPA 2.0,并且正在使用Hibernate作为实现。

以下是关于我遇到此问题的关系之一的注释:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="BOOK_THEME", 
joinColumns=@JoinColumn(name="BOOK_ID", referencedColumnName="BOOK_ID"),
inverseJoinColumns=@JoinColumn(name="THEME_ID", referencedColumnName="THEME_ID"))
@OrderColumn(name="THEME_SEQUENCE")
private List<Theme> themes;

getter和setter只是标准的,它是一种单向关系(Theme中没有书籍)。

我认为这应该是我如何设置注释的问题。有谁知道我错了什么?

1 个答案:

答案 0 :(得分:1)

我发现用@Fetch(FetchMode.SUBSELECT)注释主题完成了我的目标,但更好的解决方案是在hibernate属性中设置hibernate.default_batch_fetch_size。这样我就可以将它设置为某个数字(我选择了100),它可以同时提高所有懒惰和渴望获取许多关系的性能。