从独立索引中删除,不会反映在已删除实体用作 @IndexedEmbedded 的索引中

Deleting from a standalone index, does not reflect on the index where the deleted entity is used as @IndexedEmbedded

我们正在使用休眠搜索 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'.

老兄->xyz

预期结果应该是记录应该从索引 'b' 以及 'master-index'.

中删除

hibernate search 是否提供了一种方法来处理这种情况。

Hibernate Search 期望双向关联在两侧一致更新。

这意味着,当您删除 B 时,您应该将其从 A.b 中删除。这将导致实体发生变化 A,这将触发实体的重新索引。

如果 A 没有重新索引,这可能意味着您忘记从 A.b.

中删除 B

确定了为什么这不起作用的原因。将尝试在下面提供这些发现:

最初在我的旧代码中,我们的系统使用查询获取要删除的数据,然后触发 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);
            }

确定了为什么这不起作用的原因。将尝试在下面提供这些发现:

最初在我的旧代码中,我们的系统使用查询获取要删除的数据,然后触发 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);
            }