我有两个对象的应用程序,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"
}
你可能忘了更新双方的关联。当 Hibernate 索引
TableDoc
时,tableRows
关联不包含您的新 TableRow
(还),因此即使 Hibernate Search 重新索引,生成的文档也不包含新的表行。
试试这个:
public TableRow create(TableRow tableRow) {
tableRow.getTableDoc().getTableRows().add(tableRow);
return tableRowRepository.save(tableRow);
}