私はneo4jの非常に奇妙な動作をしています。2 つのノード間の関係が失われることがありますが、現在は問題を再現できません。
たとえば、次のノードがあります。
@NodeEntity(label = "Worker")
public class WorkerEntity {
@GraphId
private Long mId;
@Relationship(type = "managed_by")
private Iterable<UserEntity> mUsers;
}
@NodeEntity(label = "User")
public class UserEntity {
@GraphId
private Long mId;
@Property(name = "name")
private String mName;
}
同じユーザー プロパティを変更すると、"managed_by" の関係が失われることがあります。
問題がわかりません...おそらく UserEntity に着信関係がないのでしょうか? 常に必要ですか?
ありがとうございました!
アップデート
エンティティを変更するコードを単純化します。
@RestController
public class WorkerCtrl {
public void update() {
mUserService.update();
mWorkerService.update();
}
}
@Service
public class UserService {
@Transactional
public void update() {
UserEntity lUser = mUserDao.findById(...);
lUser.setName(...);
mUserDao.save(lUser);
}
}
@Service
public class WorkerService {
@Transactional
public void update() {
WorkerEntity lWorker = mWorkerDao.findById(...);
lWorker.setName(...);
mWorkerDao.save(lWorker);
}
}
コントローラーの更新を呼び出した後、次のことがあることがあります。
- ユーザーエンティティが変更されました
- worker エンティティは変更されていません (2 つの呼び出しの間の例外である可能性があります)
- managed_by 関係が削除されました!!!!
アップデート
数日後、問題が別の時間に発生し、ログが増えました
08:49:07 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] flushing end node of: ($6476)-[:managed_by]->($6477)
08:49:07 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] flushing start node of: ($6476)-[:managed_by]->($6477)
08:49:07 -04:00 DEBUG [org.neo4j.ogm.session.request.SessionRequestHandler] {"statements":[{"statement":"MATCH ($6476)-[_0:`managed_by`]->($6477) WHERE id($6476)={$6476} AND id($6477)={$6477} DELETE _0","parameters":{"$6477":6477,"$6476":6476},"resultDataContents":["row"],"includeStats":false}]}
08:49:07 -04:00 DEBUG [org.neo4j.ogm.session.request.DefaultRequest] POST https://db-*****************.graphenedb.com:24780/db/data/transaction/28723, request: {"statements":[{"statement":"MATCH ($6476)-[_0:`managed_by`]->($6477) WHERE id($6476)={$6476} AND id($6477)={$6477} DELETE _0","parameters":{"$6477":6477,"$6476":6476},"resultDataContents":["row"],"includeStats":false}]}
08:49:07 -04:00 DEBUG [org.neo4j.ogm.session.request.DefaultRequest] Response is OK, creating response handler
ログからわかるように、"flushing start node of..." の後、関係 "managed_by" は neo4j によって削除されます。
これらのログが説明を見つけるのに役立つことを願っています!
アップデート
その他のログ
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($11989)-[:managed_by]->($11990)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($14040)-[:managed_by]->($14041)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($5672)-[:managed_by]->($5673)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($4560)-[:managed_by]->($4561)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($5490)-[:managed_by]->($5491)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($4412)-[:managed_by]->($4413)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($9494)-[:managed_by]->($9495)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($4446)-[:managed_by]->($4447)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($5158)-[:managed_by]->($5159)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($9301)-[:managed_by]->($9302)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($4086)-[:managed_by]->($4087)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-init: ($3528)-[:managed_by]->($3529)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context initialised with 47 relationships
14:51:15 -04:00 DEBUG [org.neo4j.ogm.session.transaction.Transaction] commit invoked
14:51:15 -04:00 DEBUG [org.neo4j.ogm.session.transaction.TransactionManager] POST https://******************.graphenedb.com:24780/db/data/transaction/29375/commit
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] visiting: it.cedox.server.entity.UserEntity@1dc975d
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] it.cedox.server.entity.UserEntity@1dc975d has changed
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] mapping references declared by: it.cedox.server.entity.UserEntity@1dc975d
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-del: ($4962)-[null:managed_by]->($4963)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.session.transaction.TransactionManager] Status code: 200
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] flushing end node of: ($4962)-[:managed_by]->($4963)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] flushing start node of: ($4962)-[:managed_by]->($4963)
14:51:15 -04:00 DEBUG [org.neo4j.ogm.session.transaction.TransactionManager] {"results":[],"errors":[]}
14:51:15 -04:00 DEBUG [org.neo4j.ogm.session.request.SessionRequestHandler] {"statements":[{"statement":"MATCH ($4963) WHERE id($4963)={$4963} SET $4963:`User`, $4963+={$4963_props} WITH $4963 MATCH ($4962)-[_0:`managed_by`]->($4963) WHERE id($4962)={$4962} DELETE _0","parameters":{"$4962":4962,"$4963":4963,"$4963_props":{"lastName":"*******","enabled":true,"username":"********","firstAccessDate":null,"email":"**********","roles":"ADMIN","firstAccess":true,"changePassword":false,"firstName":"********","password":"********"}},"resultDataContents":["row"],"includeStats":false}]}
この問題は、エンティティを保存するときに発生します。エンティティ(POJO)にはWorkerEntityへの参照がないため、neo4jが言った理由
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] visiting: it.cedox.server.entity.UserEntity@1dc975d
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] it.cedox.server.entity.UserEntity@1dc975d has changed
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] mapping references declared by: it.cedox.server.entity.UserEntity@1dc975d
14:51:15 -04:00 DEBUG [org.neo4j.ogm.mapper.EntityGraphMapper] context-del: ($4962)-[null:managed_by]->($4963)
コンテキスト初期化とは何ですか?