我有一个看起来像这样的简单模型(使用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
字段编制索引。
答案 0 :(得分:0)
如果您正在懒惰地加载集合,但是对于特定用途,您需要确保在会话关闭之前已加载集合,您可以使用Hibernate.initialize(Object obj)
如果你实际上总是需要加载集合,你应该确实加载它