OrientDB:删除使用Object API创建的记录和引用

时间:2016-04-22 22:00:14

标签: java orientdb orientdb-2.1

我正在使用OrientDB 2.1.6对象API。

我有两个POJO,其关系为1到N:

public static class Results {
    private String userId;
    private String templateId;
    private Double totalLength;
    private List<String> visibleFields;
    private Boolean filterable;
    @OneToMany(orphanRemoval = true)
    private List<ResultItem> items;

    //Generic getters and setters
}

public static class ResultItem {
    private String id;
    private String vsId;
    private String entryTemplateId;
    private String objectType;
    private String objectTypeLabel;
    private String capabilityComment;
    private Boolean currentVersion;
    private Double contentSize;
    private String name;
    private String objectStoreId;
    private String mimeType;
    private HashMap<String, String> attributes;
    private Date dateLastModified;

    //generic getters and setters
}

这会在OrientDB中创建两个类。如果我使用Object API删除Results实例,它将正确删除关联的ResultItem行。

我正在尝试使用“控制台”删除特定的ResultItem记录,如下所示:

orientdb {db=test}> find references #15:6392 Found
[{rid:#15:6392,referredBy:[1]}] in 0.014000 sec(s).

orientdb {db=test}> delete from ResultItem where @rid=#15:6392 Delete
record(s) '1' in 0.006000 sec(s).

orientdb {db=test}> find references #15:6392 Found
[{rid:#15:6392,referredBy:[1]}] in 0.014000 sec(s).

控制台输出表明该记录已被删除但仍继续包含“参考”。

当我回到Object api并尝试db.detachAll(results,true);时,这表现为一个问题。它抛出了这个异常,我认为是由于孤儿关系。

Caused by: java.lang.NullPointerException
    at com.orientechnologies.orient.object.db.OObjectLazyList.convertAndDetachAll(OObjectLazyList.java:456)
    at com.orientechnologies.orient.object.db.OObjectLazyList.convertAndDetachAll(OObjectLazyList.java:432)
    at com.orientechnologies.orient.object.db.OObjectLazyList.detachAll(OObjectLazyList.java:424)
    at com.orientechnologies.orient.object.enhancement.OObjectProxyMethodHandler.detachAll(OObjectProxyMethodHandler.java:165)
    at com.orientechnologies.orient.object.enhancement.OObjectEntitySerializer.detachAll(OObjectEntitySerializer.java:261)
    at com.orientechnologies.orient.object.db.OObjectDatabaseTx.detachAll(OObjectDatabaseTx.java:809)
    at com.orientechnologies.orient.object.db.OObjectDatabaseTx.detachAll(OObjectDatabaseTx.java:327)

如何删除记录中的关系?

1 个答案:

答案 0 :(得分:1)

我试过你的案子,我得到了同样的结果。

这是对引用的限制,因为没有检查@RID一致性,当您删除文档时,删除所有引用将激活DB的完整扫描以搜索链接到第一个文档的所有文档然后删除引用。

这将是一项非常昂贵的操作,需要花费很多时间,这是一个原因,因为使用边缘而不是LINKSLINKLIST,...

希望有所帮助