从独立索引中删除,不会反映在已删除实体用作 @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);
}
我们正在使用休眠搜索 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);
}