0

我在使用带有休眠搜索 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 的子级持久化在弹性搜索索引中。还行吧。当我直接编辑 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); 

问候。

4

1 回答 1

0

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

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

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

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

请参阅参考文档的这一部分

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

于 2021-09-17T11:59:12.237 回答