代码之家  ›  专栏  ›  技术社区  ›  s_t_e_v_e

SDN 2.1.0/neo4j 1.8:java.lang.IllegalArgumentException:无法获取字段“schoolRef”的单个字段值

  •  1
  • s_t_e_v_e  · 技术社区  · 11 年前

    我可以添加并保存多个SchoolRef,但在检索(祖先并急切地获取)Education对象,然后尝试添加另一个SchoolRefs后出现错误。这适用于SDN2.0.1,但我也更改了其他内容,包括下面的Repository/Cypher查询,所以我无法将其与升级隔离开来。

    @Fetch @RelatedTo(type = "EDUCATION_HAS_SCHOOLREF")
    private Set<SchoolRef> schoolRefs = new HashSet<SchoolRef>();
    
    public Education() {
    }
    
    public void addSchoolRef(SchoolRef schoolRef) {
        getSchoolRefs().add(schoolRef);
    }
    

    存储库:

    public interface UserRepository extends GraphRepository<User>, CypherDslRepository<User> {
    
    @Query("start id=node:Identifier(identifier={0}) match id<-[:USER_HAS_IDENTIFIER]-user return user")
    public User findById(String id);
    

    堆栈跟踪:

    Caused by: java.lang.IllegalArgumentException: Cannot obtain single field value for field 'schoolRef'
        at org.springframework.data.neo4j.fieldaccess.RelatedToSingleFieldAccessorFactory$RelatedToSingleFieldAccessor.getValue(RelatedToSingleFieldAccessorFactory.java:94)
        at org.springframework.data.neo4j.fieldaccess.DefaultEntityState.getValue(DefaultEntityState.java:97)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyEntityStatePropertyValue(SourceStateTransmitter.java:90)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.access$000(SourceStateTransmitter.java:40)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter$2.doWithAssociation(SourceStateTransmitter.java:61)
        at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:207)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyPropertiesFrom(SourceStateTransmitter.java:57)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.loadEntity(Neo4jEntityConverterImpl.java:100)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:92)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister$CachedConverter.read(Neo4jEntityPersister.java:170)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189)
        at org.springframework.data.neo4j.support.Neo4jTemplate.createEntityFromState(Neo4jTemplate.java:180)
        at org.springframework.data.neo4j.fieldaccess.RelationshipHelper.createEntitySetFromRelationshipEndNodes(RelationshipHelper.java:130)
        at org.springframework.data.neo4j.fieldaccess.RelatedToFieldAccessor.createEntitySetFromRelationshipEndNodes(RelatedToFieldAccessor.java:86)
        at org.springframework.data.neo4j.fieldaccess.RelatedToSingleFieldAccessorFactory$RelatedToSingleFieldAccessor.getValue(RelatedToSingleFieldAccessorFactory.java:76)
        at org.springframework.data.neo4j.fieldaccess.DefaultEntityState.getValue(DefaultEntityState.java:97)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyEntityStatePropertyValue(SourceStateTransmitter.java:90)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.access$000(SourceStateTransmitter.java:40)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter$2.doWithAssociation(SourceStateTransmitter.java:61)
        at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:207)
        at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyPropertiesFrom(SourceStateTransmitter.java:57)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.loadEntity(Neo4jEntityConverterImpl.java:100)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:92)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister$CachedConverter.read(Neo4jEntityPersister.java:170)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:244)
        at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:231)
        at org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:293)
        at org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:287)
        at org.springframework.data.neo4j.fieldaccess.RelationshipHelper.getOrCreateState(RelationshipHelper.java:119)
        at org.springframework.data.neo4j.fieldaccess.RelationshipHelper.createSetOfTargetNodes(RelationshipHelper.java:111)
        at org.springframework.data.neo4j.fieldaccess.RelatedToFieldAccessor.createSetOfTargetNodes(RelatedToFieldAccessor.java:82)
        at org.springframework.data.neo4j.fieldaccess.RelatedToCollectionFieldAccessorFactory$RelatedToCollectionFieldAccessor.setValue(RelatedToCollectionFieldAccessorFactory.java:66)
        at org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet.updateValue(ManagedFieldAccessorSet.java:94)
        at org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet.update(ManagedFieldAccessorSet.java:82)
        at org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet.add(ManagedFieldAccessorSet.java:108)
    

    ----编辑: 相同的错误,但在不同的情况下。。

        School school = new School();
        school = neo4j.repositoryFor(School.class).save(school);
    
        User user1 = new User("Junit", "1");
        SchoolRef schoolRef1 = new SchoolRef();
        schoolRef1.setSchool(school);
        user1.addSchoolRef(schoolRef1);
        user1 = neo4j.repositoryFor(User.class).save(user1);
    
        User user2 = new User("Junit", "2");
        SchoolRef schoolRef2 = new SchoolRef();
        schoolRef2.setSchool(school);
        user2.addSchoolRef(schoolRef2);
        user2 = neo4j.repositoryFor(User.class).save(user2);  // <- error here
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   s_t_e_v_e    11 年前

    有时我会对显而易见的问题视而不见。。。

    在我的案例中,SchoolRef指的是一所学校,但学校可以有很多SchoolRef。我错误地执行了School,只提到了SchoolRef。

    我能够创建多个引用单个学校的学校参考,但当我试图获取一个有多个引用的学校时,出现了这个错误。

        2
  •  -1
  •   BinaryBlake    10 年前

    我们也遇到了这个问题,但这是由于与同一品牌有单独的关系。