Lucene索引未使用Hibernate Search和Spring Data进行更新
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene索引未使用Hibernate Search和Spring Data进行更新相关的知识,希望对你有一定的参考价值。
我正在使用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也被传递过了。
你需要肯定的后面参考。如果没有它们,特别是没有@ContainedIn,搜索就无法知道它必须在DatasheetDocument实例更改时更新数据表索引。
你有没有将mappedBy添加到一对多方面?
@OneToMany(cascade = CascadeType.REMOVE, mappedBy="m_datasheet")
private Set<DatasheetDocument> m_documents;
另外,如何更新DatasheetDocument?你能展示代码吗?无论哪种方式,您都需要开始双向关联。
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.openSession()
Object customer = fullTextSession.load( Datasheet.class, datasheetDocument.getDatasheet.getId() );
fullTextSession.index(customer);
fullTextSession.flushIndex();
以上是关于Lucene索引未使用Hibernate Search和Spring Data进行更新的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate Search 手动索引抛出“org.hibernate.TransientObjectException:实例未与此会话关联”