lucene index не получает синхронизацию, когда происходит какое-либо обновление в БД через спящий режим
Я работаю над некоторыми вещами POC наПоиск в спящем режиме на основе Lucene используя ниже env:
Зимует-поисковые системы 4.4.2.Final.jarLucene-ядро-3.6.2.jarMySQL 5.5использование@Indexed
аннотация по классу домена.использование@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
над полем.использование@IndexedEmbedded
над коллекцией экземпляров другого класса домена.Я сделал явную индексациюТОЛЬКО при запуске приложения(как написано в Hibernate Search API, Hibernate Search будет прозрачно индексировать каждый объект, сохраненный, обновленный или удаленный через Hibernate Core,Hibernate Search Indexing) через код ниже:
private static void doIndex() throws InterruptedException {
Session session = HibernateSearchUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
fullTextSession.close();
}
Он отлично работает, когда индексация и поиск выполняются на уже заполненной БД, а также при операции создания и удаления через ядро гибернации в приложении.
Но НЕ для какой-либо операции обновления существующих данных через Hibernate Core, поскольку я не получаю обновленные данные, когда выполняю поиск по этой информации через поиск в спящем режиме..
Не знаю причину того, что это проблема с Hibernate Search или lucene, означает, что либо индекс НЕ обновляется, либо какая-либо другая причина, по которой не получается обновленный результат через Hibernate Search.
Класс пользователя:
@Entity
@Table(name = "user")
@Indexed
public class User implements java.io.Serializable {
private static final long serialVersionUID = 5753658991436258019L;
private Integer idUser;
@Field(index = Index.YES, analyze = Analyze.YES, norms = Norms.NO, store = Store.NO)
private String Name;
private Set<UserInfo> userInfos = new HashSet<UserInfo>(0);
public User() {
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "iduser", unique = true, nullable = false)
public Integer getIdUser() {
return idUser;
}
public void setIdUser(Integer idUser) {
this.idUser = idUser;
}
@Column(name = "name", nullable = false, length = 256)
public String getName() {
return this.Name;
}
public void setName(String tenantName) {
this.Name = tenantName;
}
@IndexedEmbedded
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserInfo> getUserInfos() {
return userInfos;
}
public void setUserInfos(Set<UserInfo> userInfos) {
this.userInfos = userInfos;
}
}
Класс UserInfo:
@Entity
@Table(name = "userInfo")
public class UserInfo implements java.io.Serializable {
private static final long serialVersionUID = 5753658991436258019L;
private Integer iduserInfo;
private User user;
private String address;
public UserInfo() {
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "iduserInfo", unique = true, nullable = false)
public Integer getIduserInfo() {
return iduserInfo;
}
public void setIduserInfo(Integer iduserInfo) {
this.iduserInfo = iduserInfo;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", nullable = false)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO, norms=Norms.NO)
@Column(name = "address", nullable = false, length = 256)
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}