我们正在使用休眠搜索5.9.2。
我们有两个具有A和B的实体。A与B具有一对多关系。我们按如下方式使用它们:
@Entity
@Indexed(index="master_index")
public class A{
@IndexedEmbedded
private Set<B> b= new HashSet<>(0);
//Setter and getter for b
}
@Entity
@Indexed(index = "b")
public class B{
@ContainedIn
private A a;
//Setter and getter for a
}
.hbm文件下定义了一对多关系。
现在,当某些记录直接从索引B中删除(但通过休眠过程)时,不会从'master-index'中删除同一记录。
让我们假设我有一条记录“ xyz”,该记录在索引B下可用,并且在“ A”下也可用,并且具有类似DUDE(A的数据)的关系,可以包含许多数据,例如“ xyz”。
DUDE-> xyz
预期结果应该是记录应从索引'b'以及'master-index'中删除。
冬眠搜索提供了一种处理这种情况的方法。
答案 0 :(得分:1)
确定了原因,为什么它不起作用。将尝试在下面提供这些发现:
最初,在我的旧代码中,我们的系统通过查询获取要删除的数据,然后触发了executeUpdate(),并且没有使用session.delete()删除数据。由于这个原因,休眠缓存不知道该对象的删除。
下面是新旧代码:
旧版本:
Query query = session.getNamedQuery("deleteBySeqnumRec");
query.setLong("seqnum", seqnum);
int result = query.executeUpdate();
status.setNumOfRows(result);
新版本
DataTO dataTO = selectById(new DataTO, seqnum);
if(!dataTO.isRecNotFound()) {
session.delete(dataTO);
status.setNumOfRows(1);
}
答案 1 :(得分:0)
Hibernate Search希望双向关联在双方上保持一致。
这意味着删除B
时,应将其从A.b
中删除。这将导致实体A
发生变化,这将触发该实体的重新索引。
如果A
未重新编制索引,则可能意味着您忘记从B
中删除A.b
。