我正在使用Spring Boot和Spring Data开始使用Hibernate Search / Lucene,但我遇到的问题是索引没有更新(使用Luke工具检查)。
我的域名中有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.componentName
和documents.manufacturer.name
。
但是,当我现在通过调用Spring Data @RestController
类的CrudRepository
类进行更新时,更改直接字段时,索引仅会发生更改/ {> Datasheet
(例如名称或描述)。将内容更改为DatasheetDocument
个实例不会更新索引。知道为什么会这样吗?
请注意,我已尝试向父级添加反向引用。对于DatasheetDocument
:
@ManyToOne
@ContainedIn
private Datasheet m_datasheet;
对于Manufacturer
:
@ManyToMany
@ContainedIn
private Set<DatasheetDocument> m_datasheetDocuments;
但这没有用。
我正在使用Spring boot 1.0.1,其中包括Hibernate 4.3.1。我添加了Hibernate Search 4.5.1。我看到Lucense 3.6.2也被传递过了。
答案 0 :(得分:1)
您确实需要后退参考。没有它们,特别是没有 @ContainedIn ,当 DatasheetDocument 实例更改时,搜索无法知道它必须更新数据表索引
您是否已将 mappedBy 添加到一对多方?
@OneToMany(cascade = CascadeType.REMOVE, mappedBy="m_datasheet")
private Set<DatasheetDocument> m_documents;
另外,如何更新 DatasheetDocument ?你能展示代码吗?无论哪种方式,您都需要开始双向关联。
答案 1 :(得分:-1)
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.openSession()
Object customer = fullTextSession.load( Datasheet.class, datasheetDocument.getDatasheet.getId() );
fullTextSession.index(customer);
fullTextSession.flushIndex();