2016-04-22 21 views
1

我正在使用OrientDB 2.1.6 Object API。OrientDB:删除使用Object 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) 

如何删除与记录一起的关系?

+0

嗨弗雷德里克,你有一个小的数据库测试或整个Java代码来尝试你的情况? – LucaS

+0

不是。但是,我已经在描述中粘贴了两个POJO,以及在删除记录后显示残留引用的控制台命令。可以通过实例化结果POJO和测试数据并使用Object api保存结果对象来重现。 –

回答

1

我试过你的情况,我得到了同样的结果。

这是对参考文献的限制,因为不存在对@RID一致性的检查,并且当您删除文档时,删除所有参考将激活对数据库的全面扫描以搜索与第一个链接的所有文档,然后放下参考文献。

这将是一个非常昂贵的操作,它会占用大量的时间,这是一个原因,因为使用边缘代替reccomended的LINKSLINKLIST,...

希望它可以帮助

+0

感谢您的检查。只是为了澄清,如果这需要性能权衡,我并不期望删除系统地发生。问题是我不知道如何从“控制台”手动清除这些引用。有没有可以运行的查询?下面是一个伪示例来阐明意图:从引用中删除WHERE @ rid =#15:6392。我的理解是“边缘”不适用于Object api,那是对的吗? –

+0

Hi @Frederic,如果你想从其他记录的引用中删除一个'@ rid',你可以使用这个查询:'UPDATE MyClass REMOVE myProperty =#18:10'。这会从'MyClass'类的'References'中删除'@rid#18:10'。 – LucaS

+0

@LucaS这个效率如何?它是否在列表中顺序搜索清除? – Michael