通过休眠在数据库中进行任何更新时,lucene索引未同步 [英] lucene index not getting sync when any update occurs in DB through hibernate

查看:55
本文介绍了通过休眠在数据库中进行任何更新时,lucene索引未同步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下环境在基于Lucene的Hibernate Search 上进行一些POC方面的工作:

I am working on some POC stuff on Hibernate Search based on Lucene using below env:

  • hibernate-search-engine-4.4.2.Final.jar
  • lucene-core-3.6.2.jar
  • MySQL 5.5
  • 在域类上使用@Indexed注释.
  • 在字段上使用@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO).
  • 在不同域类的实例的集合上使用@IndexedEmbedded.
  • hibernate-search-engine-4.4.2.Final.jar
  • lucene-core-3.6.2.jar
  • MySQL 5.5
  • Use @Indexed annotation on domain class.
  • Use @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) over field.
  • Use @IndexedEmbedded over collection of Instance of different domain class.

我在应用程序开始时做了 ONLY 的显式索引编制(因为这是用Hibernate Search API编写的,Hibernate Search将透明地索引通过Hibernate Core持久,更新或删除的每个实体,休眠搜索索引)通过以下代码:

I did explicit indexing ONLY on start of application (as this is written in Hibernate Search API that Hibernate Search will transparently index every entity persisted, updated or removed through Hibernate Core,Hibernate Search Indexing) through below code:

private static void doIndex() throws InterruptedException {
    Session session = HibernateSearchUtil.getSession();

    FullTextSession fullTextSession = Search.getFullTextSession(session);
    fullTextSession.createIndexer().startAndWait();

    fullTextSession.close();
}

在索引&搜索是在已经播种的数据库以及create&通过应用程序内的休眠核心进行删除操作.

It works fine when indexing & searching is done on already seeded DB as well as on create & delete operation through hibernate core within application.

但是不能通过Hibernate Core对现有数据进行任何更新操作,因为通过休眠搜索进行此搜索时我没有得到更新的数据.

But NOT on any update operation on existing data through Hibernate Core as I am not getting the updated data when do search on this through hibernate search.

不知道是Hibernate Search还是lucene出现问题的原因,这意味着索引未得到更新,或者由于其他原因无法通过Hibernate Search获得更新结果.

Don't know the reason that whether it is problem with Hibernate Search Or lucene, means either index is NOT getting updated or some other reason due to which not getting the updated result through 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类:

UserInfo Class:

@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;
}
}

推荐答案

尝试添加

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", nullable = false)
@ContainedIn
public User getUser() {
   return user;
}

这篇关于通过休眠在数据库中进行任何更新时,lucene索引未同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆