es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hibernate Search 6, actualizar índice después de actualizar entidad.

No encontré desafortunadamente una solución para mi problema y necesito ayuda.
Tengo dos entidades así:

@Table(name = "A")
@Entity
@Indexed
@Getter
@Setter
@NoArgsConstructor
public class EntityA {

@IndexedEmbedded
@OneToOne(cascade = CascadeType.ALL)
private EntityB b;

}

@Table(name = "B")
@Entity
@Indexed
@Getter
@Setter
@NoArgsConstructor
public class EntityB {

@OneToOne(mappedBy = "b")
private EntityA a;

@KeywordField(name = "text_sort", sortable = Sortable.YES)
@FullTextField(projectable = Projectable.YES)
@Column(nullable = false)
private String text;

}

Hago un primer guardado para mi EntityA:

EntityB entityB = new EntityB();
entityB.setText("texto");
EntityA entityA = new EntityA();
entityA.setB(entityB);
entityARespository.save(entityA);

Luego quiero actualizar el campo text en el entityB, así que primero obtengo el entityA de la base de datos y luego hago la actualización y guardo el entityA:

EntityA entityA = entityARepository.findById(1L);
entityA.getB().setText("test")
entityBRepository.save(entityA);

Luego, cuando hago una búsqueda con la cadena “test” no encuentro ningún resultado, pero con la cadena “texto” sí. Eso significa que el índice no se actualiza, pero no encuentro dónde está el problema.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el índice no se está actualizando después de actualizar el campo de texto en EntityB. Una solución para esto es actualizar manualmente el índice utilizando la API de Hibernate Search después de realizar la actualización.

    Puedes utilizar FullTextEntityManager para abrir una sesión y actualizar el índice para la entidad correspondiente.

    Aquí tienes un ejemplo de código:

    import org.hibernate.search.jpa.FullTextEntityManager;
    import org.hibernate.search.jpa.Search;
    
    // después de hacer la actualización
    EntityB updatedB = entityA.getB();
    updatedB.setText("test");
    
    // guardar la entidadA con el campo de texto actualizado
    entityARepository.save(entityA);
    
    // Actualizar el índice para EntityB
    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
    fullTextEntityManager.index(updatedB);
    fullTextEntityManager.flushToIndexes();
    
    

    Esto debería actualizar el índice para EntityB para que el valor de texto actualizado se incluya en los resultados de búsqueda.

Comments are closed.