ある訪問者が居住者への保留中の訪問リクエストを作成するシナリオがあります。次に、居住者からの返信に基づいて、訪問が承認または拒否されます。しかし、新しいリクエストを作成する前に、訪問者が居住者から永久承認訪問許可を付与されている可能性もあります。その場合、承認サイクルを行う必要はありません。
継承を使用できるようにエンティティをモデル化したいのですが、承認/不承認が居住者から訪問者に発生する間、保留中の訪問要求の関係が訪問者から居住者に作成されます。
一般的な Person クラスは次のとおりです。
public abstract class Person extends Entity {
@Property private String name;
@Property private String mobileNumber;
@Property private String emailAddress;
@Property private String aadhardId;
}
Entity クラスは spring-OGM の例と同じであることに注意してください。関係タイプが設定された Resident は次のとおりです。
@NodeEntity(label = "Resident")
public class Resident extends Person {
@Autowired
Session session;
@Relationship(type = "PENDING-VISIT", direction = Relationship.INCOMING)
Set<PendingVisit> pendingVisits = new HashSet<>();
@Relationship(type = "PERMANENTLY-APPROVED-VISIT", direction = Relationship.OUTGOING)
Set<PermanentlyApprovedVisit> permanentlyApprovedVisits = new HashSet<>();
そして訪問者:
@NodeEntity(label="Visitor")
public class Visitor extends Person {
@Autowired
ResidentRepository residentRepository;
@Relationship(type = "PENDING-VISIT", direction = Relationship.OUTGOING)
private Set<PendingVisit> pendingVisit = new HashSet<>();
public Set<PendingVisit> getPendingVisits() {
return pendingVisit;
}
@Relationship(type = "PERMANENTLY-APPROVED-VISIT",direction = Relationship.INCOMING)
Set<PermanentlyApprovedVisit> permanentlyApprovedVisits = new HashSet<>();
以下は、一般的な Visit、PendingVisit、PermanentlyApprovedVisit 関係をこの順序で示したものです。
パブリック抽象クラス 訪問{
@GraphId private Long visitId;
@StartNode private T visitRequester;
@EndNode private R visitResponder;
@Property private Date dov;
@RelationshipEntity(type="PENDING-VISIT")
public class PendingVisit extends Visit<Visitor, Resident> {
public PendingVisit(Visitor visitor, Resident resident){
super(visitor,resident);
}
}
@RelationshipEntity(type="PERMANENTLY-APPROVED-VISIT")
public class PermanentlyApprovedVisit extends Visit<Resident,Visitor> {
private final boolean permanentlyApproved = true;
public PermanentlyApprovedVisit(Resident resident, Visitor visitor){
super(resident,visitor);
}
}
pendingVisit を作成しようとするとき、最初に PErmanentlyApprovedVisit 関係が既に存在するかどうかを確認します。私は自分のテストを書いていますが、これが私がテストする方法です:
Optional<PermanentlyApprovedVisit> permanentlyApprovedVisit = Optional.ofNullable(residentRepository.findIfVistorApprovedPermanentlyByResident(resident.getId(), this.getId()));
if(permanentlyApprovedVisit.isPresent())
return permanentlyApprovedVisit.get();
最後に、これは ResidentRepository メソッドです。
@Query(" OPTIONAL MATCH (resident:Resident)-[r:PERMANENTLY-APPROVED-VISIT]→(visitor:Visitor)"+
" WHERE resident.id = {residentId} AND visitor.id = {visitorId}"+
"RETURN r")
public PermanentlyApprovedVisit findIfVistorApprovedPermanentlyByResident(@Param("residentId")long residentId, @Param("visitorId") long visitorId);
しかし、実行すると、次の例外が発生し続けます。
org.neo4j.ogm.session.result.ResultProcessingException: Could not initialise res
ponse
at org.neo4j.ogm.session.response.JsonResponse.parseErrors(JsonResponse.
java:165)
at org.neo4j.ogm.session.response.JsonResponse.parseColumns(JsonResponse
.java:139)
at org.neo4j.ogm.session.response.JsonResponse.initialiseScan(JsonRespon
se.java:75)
at org.neo4j.ogm.session.response.GraphModelResponse.initialiseScan(Grap
hModelResponse.java:69)
at org.neo4j.ogm.session.response.GraphModelResponse.<init>(GraphModelRe
sponse.java:39)
at org.neo4j.ogm.session.request.SessionRequestHandler.execute(SessionRe
questHandler.java:57)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.executeAndMap(
ExecuteQueriesDelegate.java:118)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.query(ExecuteQ
ueriesDelegate.java:76)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.queryForObject
(ExecuteQueriesDelegate.java:50)
at org.neo4j.ogm.session.Neo4jSession.queryForObject(Neo4jSession.java:3
30)
at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery.
execute(GraphRepositoryQuery.java:73)
at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery.
execute(GraphRepositoryQuery.java:50)
at org.springframework.data.repository.core.support.RepositoryFactorySup
port$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:431)
at org.springframework.data.repository.core.support.RepositoryFactorySup
port$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:409)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterc
eptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.
proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.
invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.in
voke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterc
eptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(
ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynami
cAopProxy.java:207)
at com.sun.proxy.$Proxy106.findIfVistorApprovedPermanentlyByResident(Unk
nown Source)
at visit.domain.Visitor.sendPendingVisitRequest(Visitor.java:62)
at visit.domain.DomainTests.shouldCreatePendingVisit(DomainTests.java:89
)
ここで達成しようとしているモデリングの種類に問題はありますか? これが Prev と Next の問題である別のスレッドを読みました。