Hibernate Search 6创建TableRow后未自动索引cellValues问题
Hibernate Search 6创建TableRow时未索引cellValues的问题解决
问题原因
创建操作中,传入的TableRow对象关联的TableDoc是仅含ID的非托管对象(JSON反序列化生成),Hibernate持久化时未正确触发TableRow的post-persist索引事件;同时双向关联仅维护了TableRow端,未更新TableDoc的tableRows集合,导致TableDoc的索引无法同步新TableRow的cellValues数据。而更新操作因先加载了托管状态的TableRow,修改后保存会触发post-update事件,索引正常更新。
解决方案
方案1:维护双向关联并使用托管实体
加载真实的TableDoc托管实体,同时更新双向关联两端,确保Hibernate自动触发索引:
public TableRow create(TableRow tableRow) { TableDoc tableDoc = tableDocRepository.findById(tableRow.getTableDoc().getId()) .orElseThrow(() -> new ObjectNotFoundException("TableDoc", "id", tableRow.getTableDoc().getId())); tableRow.setTableDoc(tableDoc); tableDoc.getTableRows().add(tableRow); tableDocRepository.save(tableDoc); return tableRowRepository.save(tableRow); }
方案2:手动触发索引
无需维护双向关联时,保存TableRow后手动调用Hibernate Search API触发索引:
@Autowired private SearchSession searchSession; public TableRow create(TableRow tableRow) { TableRow savedTableRow = tableRowRepository.save(tableRow); // 索引新创建的TableRow searchSession.indexingPlan().addOrUpdate(savedTableRow); // 若需同步更新关联的TableDoc索引,取消下一行注释 // searchSession.indexingPlan().addOrUpdate(savedTableRow.getTableDoc()); return savedTableRow; }
方案3:配置级联持久化(可选)
在TableDoc的@OneToMany注解中添加级联配置,让保存TableDoc时自动持久化关联的TableRow并触发索引:
修改TableDoc的关联注解:
@OneToMany(mappedBy = "tableDoc", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @IndexedEmbedded @JsonManagedReference private Set<TableRow> tableRows = new HashSet<>();
创建逻辑调整为:
public TableRow create(TableRow tableRow) { TableDoc tableDoc = tableDocRepository.findById(tableRow.getTableDoc().getId()) .orElseThrow(() -> new ObjectNotFoundException("TableDoc", "id", tableRow.getTableDoc().getId())); tableDoc.getTableRows().add(tableRow); tableRow.setTableDoc(tableDoc); tableDocRepository.save(tableDoc); return tableRow; }
内容的提问来源于stack exchange,提问作者Martin Kršek
相关产品推荐
相关产品推荐

