2017-01-31 6 views
1

私はスプリング・データneo4jバージョン4.1.2をボルト・ドライバ2.0.6で使用しています。私はエンティティ間の関係を壊すという問題に直面しています。Neo4j:リレーションシップを自動的に削除します

私は組織という名前のドメインを持ち、組織は多くのエンティティに属していますが、私はあまり言及していません。

組織スキーマ

public class Organization { 

     private String formalName; 
     private String shortName; 

    @Relationship(type = COUNTRY) 
     private Country country; 

     @Relationship(type = HAS_GROUP) 
     private List<Group> groupList = new ArrayList<>(); 
    } 

と国スキーマがある

public class Country { 

@Relationship(type = HAS_HOLIDAY) 
    private List< CountryHolidayCalender> countryHolidayCalenderList; 

} 

私はそれが休憩国の休日の関係などのような国のすべての関係を壊し、組織を更新しています

組織の更新コードを入力しました

Organization unit = organizationGraphRepository.findOne(unitId); 
unit.setFormalName(organizationGeneral.getFormalName()); 
unit.setShortName(organizationGeneral.getShortName()); 
organizationGraphRepository.save(unit); 

私は間違っていることを見つけることができません。私はこの時点でこの種のバグを抱えていません。

おかげロードエンティティのための

+0

'Organization'エンティティの読み込みに深度を指定しようとしましたか?例えば'organizationGraphRepository.findOne(unitId、2)' – nmervaillie

+0

私はあなたの意見を持っています。組織によってIDで見つけたときの関係はほとんどなく、セーブ後はこれらの関係、休憩の残りしか更新しません。だから私は多くの関係データを更新する必要がある場合、私はすべての1つまたは他のソリューションのカスタムクエリを書く必要がありますか? –

答えて

0

デフォルトの深さはfindOne(id)のみ与えられたエンティティ+その直接接続されているエンティティを返すことを意味1です。 あなたの場合organization --> country --> CountryHolidayCalenderには、組織と関連する国のみが読み込まれます。

これはおそらく、接続されたノードが表示されない理由です。

は、オブジェクトの状態を追跡し、変更を検出して更新を最適化します。 findsaveの間で変更されていないオブジェクト/プロパティのデータベースは更新されません。

したがって、注釈付き属性@Relationshipに触れない限り、安全に保存することができ、読み込まれていなくても変更されません。

以前のコメントに関しては、動的な深さ検索のためにSDNに遅延読み込みがありません(存在していましたが、廃止予定でした)。だから、あなたは深さを自分で管理しなければなりません。 データ量がそれほど大きくない場合は、すべてを一度にロードすることができます(find(id, -1))。 別のオプションとして、オンデマンドを読み込んで、欠落しているグラフを手動で照会することもできます。

エンティティの読み込みを細かく制御するには、this ticketに興味があります。

+0

あなたは私に1つの質問の答えを与えることができます、深さ2を使用してグラフをロードし、深さなしで保存すると、関係を壊す可能性はありますか? –

+0

これは安全で、あなたの関係は保存されるべきです – nmervaillie

関連する問題