2016-04-22 43 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