0

不幸的是,我没有找到解决问题的方法,我需要帮助。我有这样的实体

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

}

我为我的 EntityA 进行了第一次保存

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

然后我想更新entityB中的字段文本,所以我首先从数据库中获取entityA,然后进行更新并保存entityA

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

然后当我用字符串 "test" 进行研究时,没有找到任何结果,但是用字符串 "text" yes 。这意味着索引没有刷新,但我没有找到问题所在

4

1 回答 1

1

两种可能的解释:

  1. 您对值的更新test是在事务之外完成的。确保使用事务,或者如果您真的不想要一个事务,请entityManager.flush()entityBRepository.flush()调用save().

  2. 您没有等待足够长的时间来显示更新。Elasticsearch 是一个近乎实时的平台。这意味着您的更新不会立即可见,而是在定期“刷新”之后,默认情况下每秒发生一次。

    有关“刷新”概念的更多信息,请参见此处。

    您可以使用sync同步策略将 Hibernate Search 配置为在每次索引更新后强制刷新,但这样 Elasticsearch 的性能会很差。我只建议将其用于自动化测试,绝对不是在生产中。

于 2022-01-06T16:20:20.847 回答