【问题标题】:hibernate search 6 updating elasticsearch index after entity update实体更新后休眠搜索6更新弹性搜索索引
【发布时间】:2021-11-12 06:59:11
【问题描述】:

我在使用带有休眠搜索 6 的弹性搜索时遇到问题。假设我们有这个设置:

@Entity
@Table(name = "entityA")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Indexed(index = "entityA")
public class EntityA {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
  @SequenceGenerator(name = "sequenceGenerator")
  @GenericField
  private Long id;

  @Column(name = "name")
  @KeywordField
  private String name;

  @OneToOne
  @JoinColumn(unique = true)
  @Cascade(value = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.SAVE_UPDATE})
  @IndexedEmbedded
  @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
  private EntityB entityB;

}

@Entity
@Table(name = "entityB")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class EntityB {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
  @SequenceGenerator(name = "sequenceGenerator")
  @GenericField
  private Long id;

  @Column(name = "name")
  @KeywordField
  private String name;

  @OneToOne(cascade = {}, fetch = FetchType.EAGER, targetEntity = EntityA.class)
  @JoinColumn(name = "id", nullable = false)
  @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.DEFAULT)
  private EntityA entityA

}

当我第一次持久化 EntityA(即被索引的实体)时,EntityB 作为 EntityA 的子级持久化在 elasticsearch 索引中。还行吧。当我直接编辑 EntityB 并对其进行更改时会出现问题,此更改不会传播到 elasticsearch 索引。我错过了什么吗?

更新 1

@yrodiere 回答后,我做了以下更改:

@OneToOne
@JoinColumn(unique = true)
@Cascade(value = {CascadeType.MERGE, CascadeType.PERSIST, 
CascadeType.SAVE_UPDATE})
@IndexedEmbedded
@AssociationInverseSide(inversePath = @ObjectPath( 
@PropertyValue( 
propertyName = "entitya" ) ))
 private EntityB entityB; 

问题仍然存在。如果我这样做:

EntityB b = entityBRepository.findById(5051L).get();
b.setProperty("3333");
entityBRepository.save(b); 

问候。

【问题讨论】:

    标签: java spring-boot elasticsearch hibernate-search hibernate-search-6


    【解决方案1】:

    当我直接编辑EntityB并对其进行更改时出现问题,此更改不会传播到elasticsearch索引。

    您明确指示 Hibernate Search 完全按照这种方式运行:

      @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
      private EntityB entityB;
    

    reindexOnUpdate = ReindexOnUpdate.SHALLOW 的意思是“当EntityAentityB 属性发生变化时重新索引EntityA,而不是当EntityB 本身的属性(例如它的名称)发生变化时”。

    this section of the reference documentation

    我猜你添加它是为了摆脱一个告诉你 Hibernate Search 无法找到关联 EntityA.entityB 的反面的异常。在您的情况下,您似乎应该告诉 Hibernate Search 该关联的反面是什么。将mappedBy 添加到关联的一侧(警告:这将更改您的数据库架构),或使用@AssociationInverseSide(请参阅this section of the documentation)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多