18
18
import static org .assertj .core .api .Assertions .assertThat ;
19
19
20
20
import java .util .Arrays ;
21
+ import java .util .Collections ;
21
22
import java .util .List ;
22
23
import java .util .Optional ;
23
24
import java .util .stream .Collectors ;
@@ -65,6 +66,9 @@ protected static void setupData(@Autowired BookmarkCapture bookmarkCapture) {
65
66
.asString ();
66
67
transaction .run ("unwind ['German', 'English'] as name create (n:Language {name: name}) return name" )
67
68
.consume ();
69
+ personId = transaction .run ("MATCH (l:Language {name: 'German'}) CREATE (n:Person {id: randomUUID(), name: 'Helge'}) -[:HAS_MOTHER_TONGUE]-> (l) return n.id" ).single ()
70
+ .get (0 )
71
+ .asString ();
68
72
transaction .commit ();
69
73
bookmarkCapture .seedWith (session .lastBookmark ());
70
74
}
@@ -105,6 +109,20 @@ void ensureRelationshipsAreSerialized(@Autowired PersonService personService) {
105
109
});
106
110
}
107
111
112
+ @ Test // "GH-2537"
113
+ void ensure1To1RelationshipsAreSerialized (@ Autowired PersonService personService ) {
114
+
115
+ Optional <Person > optionalPerson = personService .updateRel3 (personId );
116
+ assertThat (optionalPerson ).isPresent ().hasValueSatisfying (person -> {
117
+
118
+ assertThat (person .getKnownLanguages ()).hasSize (1 );
119
+ assertThat (person .getKnownLanguages ()).first ().satisfies (knows -> {
120
+ assertThat (knows .getDescription ()).isEqualTo ("Whatever" );
121
+ assertThat (knows .getLanguage ()).extracting (Language ::getName ).isEqualTo ("German" );
122
+ });
123
+ });
124
+ }
125
+
108
126
@ Repository
109
127
public interface PersonRepository extends Neo4jRepository <Person , String > {
110
128
@@ -126,6 +144,16 @@ public interface PersonRepository extends Neo4jRepository<Person, String> {
126
144
+ "CREATE (f) - [r:KNOWS {description: rel.__properties__.description}] -> (t) "
127
145
+ "RETURN f, collect(r), collect(t)" )
128
146
Person updateRel2 (@ Param ("person" ) Person person );
147
+
148
+ @ Query (""
149
+ + "MATCH (f:Person {id: $person.__id__}) "
150
+ + "MATCH (mt:Language {name: $person.__properties__.HAS_MOTHER_TONGUE[0].__target__.__id__}) "
151
+ + "MATCH (f)-[frl:HAS_MOTHER_TONGUE]->(mt) WITH f, frl, mt "
152
+ + "UNWIND $person.__properties__.KNOWS As rel WITH f, frl, mt, rel "
153
+ + "MATCH (t:Language {name: rel.__target__.__id__}) "
154
+ + "MERGE (f)- [r:KNOWS {description: rel.__properties__.description}] -> (t) "
155
+ + "RETURN f, frl, mt, collect(r), collect(t)" )
156
+ Person updateRelWith11 (@ Param ("person" ) Person person );
129
157
}
130
158
131
159
@ Service
@@ -159,6 +187,17 @@ public Optional<Person> updateRel2(String id, List<String> languageNames) {
159
187
160
188
return original ;
161
189
}
190
+
191
+ public Optional <Person > updateRel3 (String id ) {
192
+ Optional <Person > original = personRepository .findById (id );
193
+ if (original .isPresent ()) {
194
+ Person person = original .get ();
195
+ person .setKnownLanguages (Collections .singletonList (new Knows ("Whatever" , new Language ("German" ))));
196
+ return Optional .of (personRepository .updateRelWith11 (person ));
197
+ }
198
+
199
+ return original ;
200
+ }
162
201
}
163
202
164
203
@ Configuration
0 commit comments