如何告诉Hibernate Search索引FetchType.LAZY字段?

时间:2015-08-17 07:22:36

标签: java hibernate hibernate-search

我有一个看起来像这样的简单模型(使用Lombok注释):

@Data
@Entity
@Indexed
public class Game {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Field(index = Index.YES, store = Store.YES)
  public String name;

  @Column(name="description", columnDefinition="TEXT")
  @Basic(fetch = FetchType.LAZY)
  @Field(index = Index.YES, store = Store.YES)
  public String description;  
}

为了对此进行索引,我编写了一个看起来像这样的简单通用索引器(这会索引多个类,因此缺少具体类型):

  private int index(Class<?> object, FullTextSession search_session) {
    ScrollableResults results = search_session.createCriteria(object)
                                              .setFetchSize(100)
                                              .scroll(ScrollMode.FORWARD_ONLY);
    int index = 0;
    while(results.next()) {
      index++;
      search_session.index(results.get(0));
      if (index % 10 == 0) {
        search_session.flushToIndexes();
        search_session.clear();
      }
    }
    search_session.flushToIndexes();
    search_session.clear();
    return index;
  }

要调用它,我可以这样简单地调用它:

FullTextSession search_session = Search.getFullTextSession(dao);
search_session.setFlushMode(FlushMode.MANUAL);
search_session.setCacheMode(CacheMode.IGNORE);

index(Game.class, search_session);

然而,当name字段按预期工作时,description永远不会被填充,因此永远不会被编入索引。如果我从@Basic(fetch = FetchType.LAZY)删除description注释,则代码按预期工作。为了解决这个问题,我已经更新了我的索引函数以获取具体类型,现在我手动调用.getDescription()但是有更简洁的方法来完成此操作吗?某种方法告诉Hibernate在.get()上完全填充惰性字段?

在回复karim mohsen's answer后,我将index()功能修改为这样(关键区别在于我正在调用Hibernate.initialize()):

private <T> int index(Class<T> object, FullTextSession search_session) {
  ScrollableResults results = search_session.createCriteria(object)
                                            .setFetchSize(100)
                                              .scroll(ScrollMode.FORWARD_ONLY);
  int index = 0;
  while(results.next()) {
    index++;
    T item = (T)results.get(0);
    Hibernate.initialize(item);
    search_session.index(item);
    if (index % 10 == 0) {
      search_session.flushToIndexes();
      search_session.clear();
    }
  }
  search_session.flushToIndexes();
  search_session.clear();
  return index;
}

但是,这种方法仍然没有为description字段编制索引。

1 个答案:

答案 0 :(得分:0)

如果您正在懒惰地加载集合,但是对于特定用途,您需要确保在会话关闭之前已加载集合,您可以使用Hibernate.initialize(Object obj)

如果你实际上总是需要加载集合,你应该确实加载它