Hibernate search 从独立索引中删除时,不会反映已删除实体用作@IndexedEmbedded的索引
我们正在使用HibernateSearch5.9.2 我们有两个实体A和B。A与B有一对多关系。我们使用它们如下: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
@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,请按回答进行检查。