Java OrientDB:删除使用对象API创建的记录和引用

Java OrientDB:删除使用对象API创建的记录和引用,java,orientdb,orientdb-2.1,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;

我正在使用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 {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).
控制台输出表明记录已被删除,但仍包含“引用”

当我返回到对象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)

我如何才能将关系与记录一起删除?

我尝试了你的案例,得到了与你相同的结果

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

这将是一个非常昂贵的操作,需要花费大量时间,这是原因之一,因为建议使用边而不是
链接
链接列表


希望它能帮助你

嗨,Frederic,你有一个小的DB测试或者整个Java代码来测试你的案例吗?没有。但是,我已经在描述中粘贴了两个POJO,以及显示删除记录后剩余引用的控制台命令。可以通过使用测试数据实例化结果POJO并使用对象api保存结果对象来进行复制。感谢您的检查。我只是想澄清一下,如果需要进行性能权衡,我不希望系统性地进行删除。问题是我不知道如何从“控制台”手动清理这些引用。我可以为此运行一个查询吗?下面是一个伪示例来阐明意图:从@rid=#15:6392的引用中删除。我的理解是“边”不适用于对象api,对吗?您好@Frederic,如果您想从其他记录的引用中删除
@rid
(例如
LINKSET
),您可以使用以下查询:
updatemyclass REMOVE myProperty=#18:10
。这将从类
MyClass
@LucaS的
引用中删除
@rid#18:10
?它是否在列表中按顺序搜索rid?