Hibernate 搜索在某些方法后不创建索引

问题描述 投票:0回答:1

我有两个对象的应用程序,TableDoc 和 TableRow。

@Entity
@Indexed
public class TableDoc{
  @OneToMany(mappedBy = "tableDoc", fetch = FetchType.LAZY)
  @IndexedEmbedded
  @JsonManagedReference
  private Set<TableRow> tableRows = new HashSet<>();
}
@Entity
@Indexed
public class TableRow{
  @ManyToOne
  @JoinColumn(name = "table_id")
  @JsonBackReference
  private TableDoc tableDoc;

  @FullTextField
  @Column(name = "cell_values")
  private String cellValues;
}

我正在通过这种简化的方法创建新的 TableRow 并将其附加到 TableDoc 中:

  public TableRow create(TableRow tableRow) {
    return tableRowRepository.save(tableRow);
  }

一切都正确地保存在数据库中。出于某种原因,当我使用上面的创建方法创建 TableRow 时,使用 lucene 的 Hibernate search 6 不会索引/重新索引 tableRow.cellValues。

我必须重新索引整个应用程序才能通过 cellValues 值进行查询。也更新确实创建索引,只有创建是有问题的。这是我的更新方法:

  public TableRow update(String id, TableRow tableRow) {
    TableRow tableRowToUpdate = tableRowRepository.findById(id)
        .orElseThrow(() -> new ObjectNotFoundException("TableRow", "id", id));
    tableRowToUpdate.setCellValues(tableRow.getCellValues());
    return tableRowRepository.save(tableRowToUpdate);
  }

更新和创建方法都接收相同的对象:

{
 "tableDoc":{"id":"myLongTableDocId"},
 "cellValues":"one"
}
java spring spring-boot lucene hibernate-search
1个回答
0
投票

你可能忘了更新双方的关联。当 Hibernate 索引

TableDoc
时,
tableRows
关联不包含您的新
TableRow
(还),因此即使 Hibernate Search 重新索引,生成的文档也不包含新的表行。

试试这个:

  public TableRow create(TableRow tableRow) {
    tableRow.getTableDoc().getTableRows().add(tableRow);
    return tableRowRepository.save(tableRow);
  }

另见https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#limitations-changes-asymmetric-association-updates

© www.soinside.com 2019 - 2024. All rights reserved.