2014-04-14 105 views
0

我開始使用Spring Boot和Spring Data的Hibernate Search/Lucene,但我沒有得到更新的索引問題(使用Luke工具進行檢查)。Lucene索引沒有更新與Hibernate搜索和彈簧數據

我在我的域中有3個類。這是Datasheet,我的根實體:

@Entity 
@Indexed 
public class Datasheet 
{ 

    @Id 
    @GeneratedValue() 
    private long m_id; 

    @Field(name="name") 

    private String m_name; 

    @Field(name="description") 
    private String m_description; 

    @IndexedEmbedded(prefix = "documents.") 
    @OneToMany(cascade = CascadeType.REMOVE) 
    private Set<DatasheetDocument> m_documents; 
} 

然後DatasheetDocument

@Entity 
public class DatasheetDocument 
{ 
    @Id 
    @GeneratedValue() 
    private long m_id; 

    private String m_originalFileName; 

    @Field(name="componentName") 
    private String m_componentName; 

    @IndexedEmbedded(prefix = "manufacturer.") 
    @ManyToOne 
    private Manufacturer m_manufacturer; 
} 

最後Manufacturer

@Entity 
public class Manufacturer 
{ 
    @Id 
    @GeneratedValue() 
    private long m_id; 

    @Field(name="name", analyze = Analyze.NO) 
    private String m_name; 

    private String m_website; 
} 

當我明確地呼籲索引startAndWait()org.hibernate.search.MassIndexer),那麼一切如預期的那樣。它包含字段name,description,documents.componentNamedocuments.manufacturer.name

然而,當我現在通過我的@RestController類調​​用到Spring數據CrudRepository類,指數做更新改變直接場的Datasheet(例如名稱或說明)當只有變化。改變DatasheetDocument實例不更新該索引。任何想法,爲什麼這可能是?

請注意,我已嘗試向父級添加反向引用。對於DatasheetDocument

@ManyToOne 
@ContainedIn 
private Datasheet m_datasheet; 

而對於Manufacturer

@ManyToMany 
@ContainedIn 
private Set<DatasheetDocument> m_datasheetDocuments; 

但是,這並不能幫助。

我使用的Spring引導1.0.1包括休眠4.3.1。我添加了Hibernate Search 4.5.1。我看到Lucense 3.6.2也被傳遞了。

回答

1

確實需要回參考。沒有它們,尤其是沒有@ContainedIn時,搜索無法知道它必須更新數據表索引時數據表文檔實例更改。

您是否已將mappedBy添加到一方或多方?

@OneToMany(cascade = CascadeType.REMOVE, mappedBy="m_datasheet") 
private Set<DatasheetDocument> m_documents; 

此外,如何更新DatasheetDocument?你能顯示代碼嗎?無論哪種方式,您都需要使雙向的關聯開始。

-1
FullTextSession fullTextSession = Search.getFullTextSession(session); 
fullTextSession.openSession() 

Object customer = fullTextSession.load(Datasheet.class, datasheetDocument.getDatasheet.getId()); 
fullTextSession.index(customer); 
fullTextSession.flushIndex();