我使用Spring JPA + Hibernate Search在我的应用程序中实现持久性和搜索。
我有这样的模特
public class FeatureMeta {
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(unique=true)
private String uri;
@Column
@Field
private String name;
@Field
@Column
private String businessDesc;
@Field
@Column
private String logicalDesc;
.
.
@Field
@Column(insertable=false,updatable=false)
private Long totalDownloads;
.
.
}
为了提供关于这个类的想法,“FeatureMeta”维护很少更新的元数据信息。
然而,只要用户下载有关此“功能”的信息,“totalDownloads”字段就会不断变化。 基本上“totalDownloads”不是元数据的一部分,但我必须将此字段放在模型中,因为我需要在“特征搜索”的搜索结果中显示“totalDownloads”。
我使用相同的JPA Repository来更新MySQL和Lucene索引。
我的问题是;只要对“totalDownloads”字段进行更改,是否可以仅更新Lucene索引中的“totalDownloads”而不更新MySQL中的实体?
答案 0 :(得分:1)
您必须使用@Transient注释来标记您不希望此属性成为数据库模型的一部分。
@Field
@Transient
private Long totalDownloads;
使字段瞬态也意味着它不会从数据库加载(Hibernate ORM完全忽略,但Hibernate Search不能忽略);如果这不是你想要的,你可以添加一个额外的字段:将一个映射到Hibernate ORM,另一个用Hibernate Search索引并用@Transient注释。在这种情况下,您必须使setter更新两个字段。
您可能还需要更改此配置属性:
hibernate.search.enable_dirty_check = false
因为如果实体没有其他更改,Hibernate Search将不会在Lucene索引中生成任何更改。