Spring Data Neo4j 4 (SDN4) を使用しています。1 対 1 の関係属性を「変更」しようとすると、SDN が特定の操作方法でデータベースにそれを「追加」するようです。
コード (カプセル化をスキップ)
@NoteEntity
public class Bar{
String name;
}
@NoteEntity
public class Foo {
String name;
@Relationship(type="BAR1", direction=Relationship.INCOMING)
Bar b1;
@Relationship(type="BAR2", direction=Relationship.OUTGOING)
Bar b2;
}
そして、それをテストします
@Test
public void test_add(){
Foo foo1 = new Foo("Foo1");
Bar bar1 = new Bar("Bar1");
Bar bar2 = new Bar("Bar2");
foo.b1 = bar1;
foo.b2 = bar2;
fooRepository.save(foo);
}
Neo4j クエリ ブラウザに移動すると、(Foo1)-[:BAR1]->(Bar1) と (Foo1)-[:BAR2]->(Bar2) が表示されます。
そして、これが最も重要なアクションです。Spring コンテナーを再起動し、このフォロー テストを実行します (同時に実行しないでください)。
@Test
public void test_update(){
Foo foo1 = fooRepository.findAll().iterator().next();
Bar bar3 = new Bar("Bar3");
foo.b1 = bar3;
fooRepository.save(foo);
}
Neo4j クエリ ブラウザに移動すると、3 つの関係 (Foo1)-[:BAR1]->(Bar1) および (Foo1)-[:BAR1]->(Bar3) および (Foo1)-[:BAR2] が表示されます。 →(Bar2) 元の関係(Bar1)は削除されません。
スプリング コンテナ (または Neo4j セッション) が再起動されると、1 対 1 の関係が完全に崩れてしまうようです。
現在の回避策は、すべての関係を @NoteEntity public class Foo {
String name;
@Relationship(type="BAR1", direction=Relationship.INCOMING)
List<Bar> b1;
@Relationship(type="BAR2", direction=Relationship.OUTGOING)
List<Bar> b2;
}
それを修正する他の方法はありますか?