当前位置: 首页 > 知识库问答 >
问题:

hibernate search 6在实体更新后更新elasticsearch索引

葛浩阔
2023-03-14

我在hibernate search 6中使用elasticsearch时遇到了问题。让我们假设我们有这样的设置:

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

问候。

共有1个答案

房学文
2023-03-14

当我直接编辑EntityB并对其进行更改时,问题出现了,这种更改没有传播到elasticsearch索引。

您明确指示Hibernate Search以这种方式执行:

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

< code > reindexOnUpdate = reindexOnUpdate。SHALLOW表示“当< code>EntityA的< code>entityB属性更改时,而不是当< code>EntityB本身的属性(如其名称)更改时,重新索引< code>EntityA”。

请参阅参考留档的这一部分。

我猜你添加了这个,以摆脱一个异常,告诉你Hibernate搜索无法找到关联实体A.entityB的反面。在你的情况下,你似乎应该告诉Hibernate搜索该关联的反向方面是什么。将 mapBy 添加到关联的一端(警告:这将更改数据库架构),或使用@AssociationInverseSide(请参阅文档的此部分)。

 类似资料:
  • 问题内容: 我正在尝试了解如何在Elasticsearch中更新索引文档。我不明白它是如何工作的?什么是该API指的是在做什么?假设您有一个带有嵌套文档的文档,您需要做什么来更新它? 删除文档然后索引“已更新”版本与普通更新之间有什么区别? 问题答案: 更新请求从Elasticsearch检索源,对其进行修改并将其索引回Elasticsearch。如果您已经具有使用更新的文档副本,则毫无意义。仅索

  • 我需要在另一个相关实体更新后对一个实体执行更新。 我有两个实体:和,关系为1:N。两者都有字段。状态取决于所有子状态字段。因此,如果更新了一个,我需要重新计算的新状态并持久化/更新它。 我实现了一个监听器: 监听器在中进行了注释,并且正在正确调用它。但是,在流程完成后,仍然保持旧状态,即使使用正确的新状态调用。

  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下

  • 在这种情况下,我希望检索数据,但在返回数据之前,我希望在不保存/持久化的情况下对其进行更改。 这是我的Rest控制器: 以下是服务实现: 最初我在服务上有注释。通过删除它而不在方法中使用它,我首先想到的是会话将使用存储库打开和关闭,如这里的答案所示。 这不起作用,我在评论中看到“会话将持续整个HTTP请求处理过程。”所以,在我添加的服务中 然后在我添加的方法中 在我做任何改变之前。然而,我所做的任

  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 我在JTA和Wildfly8中使用Eclipselink,问题是在提交用户事务并将数据插入数据库后,它不会更新相关实体,所以如果我重新加载页面或打开页面的新实例,它加载数据时不会插入行。