5
votes

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
  • 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.

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();
}

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

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.

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.

User Class:

@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 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;
}
}
1
What exactly do you mean with "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." Which API do you use to update the data? If you are using the Session/EntityManager save/persist methods it should work? Are you maybe using native queries queries etc?Hardy
@Hardy, I am updating already existed user name through: existingUser.setName(updatedName); session.saveOrUpdate(existingUser); Within the transaction.Atul Kumar
so my assumption is that after updating userName, hibernate search should return this user when searched by updated name.Atul Kumar
Provided saveOrUpdate fires an change event it should work. If you can debug, I would try placing a breakpoint into FullTextIndexEventListener to see whether a callback is send to the Search event listener. Also setting the hibernate log level to debug might help.Hardy
It is getting called in Add & Delete : 2014-01-07 10:39:00,737 TRACE main org.hibernate.internal.SessionImpl - after transaction completion 2014-01-07 10:39:00,737 TRACE main org.hibernate.search.backend.impl.PostTransactionWorkQueueSynchronization - Processing Transaction's afterCompletion() phase for org.hibernate.search.backend.impl.PostTransactionWorkQueueSynchronization@11563a2. Performing work. But on update NOTHING is getting called after 2014-01-07 10:44:23,933 TRACE main org.hibernate.internal.SessionImpl - after transaction completionAtul Kumar

1 Answers

0
votes

Try By adding the

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