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

Hibernate search 从独立索引中删除时,不会反映已删除实体用作@IndexedEmbedded的索引,hibernate-search,Hibernate Search,我们正在使用HibernateSearch5.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(inde

我们正在使用HibernateSearch5.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
}
@实体
@索引(index=“主索引”)
公共A类{
@指数化
私有集b=新哈希集(0);
//b的二传手和吸气手
}
@实体
@索引(index=“b”)
公共B级{
@包含
私人A;
//二传手和接球手
}
一对多关系在.hbm文件下定义

现在,当直接从索引B中删除某些记录(但通过hibernate过程)时,不会从“主索引”中删除相同的记录

让我们假设我有一个记录'xyz',它在索引B下可用,在'a'下也可用,与DUDE(a的数据)这样的关系可以包含许多像'xyz'这样的数据

都德->xyz

预期结果应该是记录应该从索引“b”以及“主索引”中删除


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

hibernate search希望双方一致地更新双向关联

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


如果未对
A
重新编制索引,则可能意味着您忘记从
A.B
中删除
B
,确定了原因,即这不起作用的原因。将尝试提供以下调查结果:

最初在我以前的代码中,我们的系统通过查询获取要删除的数据,然后触发executeUpdate(),而不是使用session.delete()删除数据。因此,hibernate缓存没有意识到对象的删除

以下是新旧代码:

旧版本:

Query query = session.getNamedQuery("deleteBySeqnumRec");   
            query.setLong("seqnum", seqnum);    
            int result = query.executeUpdate(); 
            status.setNumOfRows(result);
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);
            }
DataTO dataTO = selectById(new DataTO, seqnum);
            if(!dataTO.isRecNotFound()) {
                session.delete(dataTO);
                status.setNumOfRows(1);
            }

确定了不起作用的原因和原因。将尝试提供以下调查结果:

最初在我以前的代码中,我们的系统通过查询获取要删除的数据,然后触发executeUpdate(),而不是使用session.delete()删除数据。因此,hibernate缓存没有意识到对象的删除

以下是新旧代码:

旧版本:

Query query = session.getNamedQuery("deleteBySeqnumRec");   
            query.setLong("seqnum", seqnum);    
            int result = query.executeUpdate(); 
            status.setNumOfRows(result);
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);
            }
DataTO dataTO = selectById(new DataTO, seqnum);
            if(!dataTO.isRecNotFound()) {
                session.delete(dataTO);
                status.setNumOfRows(1);
            }

谢谢@yrodire,您是否建议手动启动索引上的删除以进行a.b删除。或者这应该由Hibernate搜索负责。此外,在5.9.2之后的版本中,HIbernate search是否注意到了这种情况。我建议调用
a.b.remove(…)
来实际删除正在删除的
b
实例。从5.9.2升级没有帮助:在Hibernate Search的更高版本中,行为是相同的。在新版本中,有一些技术限制阻止我们对此进行改进:我们不能只对已删除的实体调用getter,因为有些调用会由于从已删除的实体延迟加载而触发异常。请查看并在两天后返回,如果您的信誉超过15,请按回答进行检查。