2015-08-17 22 views
0

我有一個簡單的模型,看起來像這樣(使用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領域。

回答

0

如果你延遲加載集合正常,但對於特定的用途,你需要確保會話關閉之前收集已經加載,你可以使用Hibernate.initialize(Object obj)

如果你事實上總是需要收集加載,你應該真的加載它

+0

我試圖實現你的答案,但它仍然沒有索引'描述'字段。 'Hibernate.initialize'只能用於集合嗎? –

+0

它用於強制代理或持久集合的初始化,這隻能確保代理對象或集合的初始化;不能保證集合中的元素將被初始化/物化。請參見[this](http://www.laliluna.de/jpa-hibernate-guide/ch02s02.html)鏈接 –

+0

不幸的是,鏈接表明在這種情況下最好的方法是顯式獲取懶惰屬性。我開始放棄希望有一些泛型函數會枚舉索引之前的所有字段。 –

相關問題