我有一個簡單的模型,看起來像這樣(使用Lombok註釋):如何告訴Hibernate搜索索引FetchType.LAZY字段?
@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
永遠不會被填充,因此永遠不會被索引。如果我從description
中刪除@Basic(fetch = FetchType.LAZY)
註釋,則代碼按預期工作。要解決這個問題,我已經更新了索引函數以採用具體類型,現在我手動調用.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
領域。
我試圖實現你的答案,但它仍然沒有索引'描述'字段。 'Hibernate.initialize'只能用於集合嗎? –
它用於強制代理或持久集合的初始化,這隻能確保代理對象或集合的初始化;不能保證集合中的元素將被初始化/物化。請參見[this](http://www.laliluna.de/jpa-hibernate-guide/ch02s02.html)鏈接 –
不幸的是,鏈接表明在這種情況下最好的方法是顯式獲取懶惰屬性。我開始放棄希望有一些泛型函數會枚舉索引之前的所有字段。 –