我有两个实体(entityA和entityB),其中一个实体包含另一个@IndexedEmbedded,因为当我搜索时,我想通过entityB进行查询,并返回entityA。
关系(简化)就是这样:
public class EntityA {
private String name;
@OneToMany
@IndexedEmbedded
private List<EntityB> children;
}
public class EntityB {
@ManyToOne
@ContainedIn
private EntityA parent;
private String childName;
}
我现在遇到问题,因为在关系上,&#34;孩子&#34;在entityA中可以有多达10万件物品。无论我使用的是FullTextSession.index还是MassIndexer,都会导致OutOfMemory问题。
我实际上可以删除EntityA中的@OneToMany映射,因为当我想访问EntityB时,我通常会进行一些过滤和分页的查询,但是如果我删除了@OneToMany,那么Hibernate Search将不会索引我的EntityB。
有没有让FullTextSession.index根据&#34; children&#34;上的批处理执行索引?
答案 0 :(得分:0)
我觉得你应该将这种关系删除,例如一对多,多对一,并编写连接查询以获取所需大小的结果,获取100k行会杀死内存。
日Thnx, 苏巴
答案 1 :(得分:0)
根据您希望有效执行的查询,您可以反转索引。
您可以将EntityB标记为@Indexed
,并将其父级关联标记为@Indexed
,而不是将EntityA标记为@IndexedEmbedded
。
这样,您就不必加载100k元素。
在查询方面,您还需要将查询转换为childName:Emmanuel AND parent.name:Hardy
之类的内容
您将收到的是EntityB实例,但您可以通过简单导航或使用ResultTransformer
来访问EntityA。
请注意,如果EntityB和EntityA之间的链接很懒,您可以要求Hibernate Search调整其fetching strategy:
Criteria criteria =
s.createCriteria(EntityB.class).setFetchMode("parent", FetchMode.JOIN);
s.createFullTextQuery(luceneQuery).setCriteriaQuery(criteria);