2016-04-22 12 views
1

OrientDB 2.1.6 Object APIを使用しています。OrientDB:オブジェクトAPIで作成されたレコードと参照の削除

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に2つのクラスを作成します。

は、私は2つのこのような1 Nに関係してPOJOを持っています。 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). 

コンソール出力は、レコードが削除されていることを示唆しているが、それは「参照」を含むように続けます。

これは、オブジェクトapiに戻り、db.detachAll(結果、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

を役に立てば幸い... 1つの理由がありますこんにちはフレデリック、あなたのケースを試すために小さなDBテストやJavaコード全体がありますか? – LucaS

+0

本当に。しかし、私は2つのPOJOを記述に加えて、レコードを削除した後に残った参照を示すコンソールコマンドを貼り付けました。結果POJOをテストデータでインスタンス化し、Object APIを使用して結果のオブジェクトを保存することによって再現することができます。 –

答えて

1

あなたのケースを試しましたが、私はあなたの同じ結果を得ました。

@RID整合性のチェックがないため、文書の削除時にすべての参照を削除すると、DBのフルスキャンが有効になり、最初にリンクされたすべての文書が検索されてからドロップされます参照してください。エッジを使用して、LINKSLINKLISTの代わりにreccomendedされているので

これは非常に高価な操作になると、それは多くの時間がかかるだろう、これは

はそれが

+0

確認していただきありがとうございます。明らかにするために、パフォーマンスのトレードオフが必要な場合は、削除を体系的に行うことは期待していません。問題は、「コンソール」からこれらの参照を手動でクリーンアップする方法がわかりません。このために実行できるクエリはありますか?ここに意図を明確にするための擬似例があります。WHERE @ rid =#15:6392からのDELETE。私の理解は、 "エッジ"は、オブジェクトのAPIには適用されません、それは正しいですか? –

+0

こんにちは@Frederic、他のレコード(例えば 'LINKSET')の参照から' @ rid'を削除したいのであれば、 'UPDATE MyClass REMOVE myProperty =#18:10'というクエリを使うことができます。これはクラス 'MyClass'の' References'から '@rid#18:10'を削除します。 – LucaS

+0

@LucaSこれはいかに効率的ですか?それはリストの中で逐次的に検索しますか? – Michael

関連する問題