Метод getLinks возвращает удаленные объекты, как это предотвратить? - PullRequest
0 голосов
/ 20 ноября 2018

Ниже приведен мой код для получения списка ссылок Entity. Это работает, но проблема в том, что даже удаленный Entity возвращается, хотя Entity уже очищен и является единственным установленным свойством. Есть ли способ вообще не возвращать удаленные объекты? Или есть способ отфильтровать его?

EntityId idOfEntity = txn.toEntityId(entityId);
Entity txnEntity = txn.getEntity(idOfEntity);
EntityIterable result = txnEntity.getLinks(Arrays.asList(new String[] {linkName}));
for (Entity entity : result) {
}

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вот полный код, который я придумал:

@Override
  public boolean deleteEntities(String instance, String namespace, final String entityType) {
    final boolean[] success = {false};
    final PersistentEntityStore entityStore = manager.getPersistentEntityStore(xodusRoot, instance);
    try {
      entityStore.executeInTransaction(
          new StoreTransactionalExecutable() {
            @Override
            public void execute(@NotNull final StoreTransaction txn) {
              EntityIterable result = null;
              if (namespace != null && !namespace.isEmpty()) {
                result =
                    txn.findWithProp(entityType, namespaceProperty)
                        .intersect(txn.find(entityType, namespaceProperty, namespace));
              } else {
                result =
                    txn.getAll(entityType).minus(txn.findWithProp(entityType, namespaceProperty));
              }
              final boolean[] hasError = {false};
              for (Entity entity : result) {

                entity.getLinkNames().forEach(linkName -> {
                  Entity linked = entity.getLink(linkName);
                  entity.deleteLink(linkName, linked);
                });


                // TODO: This is a performance issue
                final List<String> allLinkNames = ((PersistentEntityStoreImpl) entityStore).getAllLinkNames((PersistentStoreTransaction) entityStore.getCurrentTransaction());
                for (final String entityType : txn.getEntityTypes()) {
                  for (final String linkName : allLinkNames) {
                    for (final Entity referrer : txn.findLinks(entityType, entity, linkName)) {
                      referrer.deleteLink(linkName, entity);
                    }
                  }
                }

                if (!entity.delete()) {
                  hasError[0] = true;
                }
              }
              success[0] = !hasError[0];
            }
          });
    } finally {
      // entityStore.close();
    }

    return success[0];
  }
0 голосов
/ 20 ноября 2018

Когда вы удаляете объект, вы обязаны проверить, есть ли входящие ссылки на удаленный объект.В противном случае могут появиться так называемые «фантомные ссылки».Вы можете установить -Dexodus.entityStore.debug.searchForIncomingLinksOnDelete=true (PersistentEntityStoreConfig#setDebugSearchForIncomingLinksOnDelete(true)) для отладки удаления в вашем приложении.С этим параметром Xodus ищет входящие ссылки на каждую удаленную сущность и выдает EntityStoreException, если найдет.Этот параметр не следует использовать в производственной среде, поскольку он значительно снижает производительность удаления сущностей.

...