0

while trying to retrieve my nodes back to my domain objects I'm getting this strange error:

Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.ch.NativeThreadSet.remove(NativeThreadSet.java:76)
    at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:678)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceRow.readFullWindow(PersistenceRow.java:158)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceRow$State$1.transition(PersistenceRow.java:115)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceRow.lock(PersistenceRow.java:59)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire(PersistenceWindowPool.java:193)
    at org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow(CommonAbstractStore.java:520)
    at org.neo4j.kernel.impl.nioneo.store.NodeStore.getRecord(NodeStore.java:76)
    at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.nodeLoadProperties(ReadTransaction.java:239)
    at org.neo4j.kernel.impl.persistence.PersistenceManager.loadNodeProperties(PersistenceManager.java:113)
    at org.neo4j.kernel.impl.core.NodeManager.loadProperties(NodeManager.java:682)
    at org.neo4j.kernel.impl.core.NodeImpl.loadProperties(NodeImpl.java:132)
    at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:584)
    at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:567)
    at org.neo4j.kernel.impl.core.Primitive.getProperty(Primitive.java:153)
    at org.neo4j.kernel.impl.core.NodeImpl.getProperty(NodeImpl.java:51)
    at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:155)
    at org.springframework.data.neo4j.support.typerepresentation.AbstractIndexingTypeRepresentationStrategy.readAliasFrom(AbstractIndexingTypeRepresentationStrategy.java:106)
    at org.springframework.data.neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:36)
    at org.springframework.data.neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:26)
    at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:96)
    at org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144)
    at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:76)
    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.RelationshipNodeFieldAccessorFactory$RelationshipNodeFieldAccessor.getValue(RelationshipNodeFieldAccessorFactory.java:102)
    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:192)
    at org.springframework.data.neo4j.support.Neo4jTemplate.createEntityFromState(Neo4jTemplate.java:180)
    at org.springframework.data.neo4j.fieldaccess.GraphBackedEntityIterableWrapper.underlyingObjectToObject(GraphBackedEntityIterableWrapper.java:41)
    at org.springframework.data.neo4j.fieldaccess.GraphBackedEntityIterableWrapper.underlyingObjectToObject(GraphBackedEntityIterableWrapper.java:27)
    at org.neo4j.helpers.collection.IterableWrapper$MyIteratorWrapper.underlyingObjectToObject(IterableWrapper.java:57)
    at org.neo4j.helpers.collection.IteratorWrapper.next(IteratorWrapper.java:47)
    at org.neo4j.helpers.collection.IteratorUtil.addToCollection(IteratorUtil.java:324)
    at org.neo4j.helpers.collection.IteratorUtil.addToCollection(IteratorUtil.java:341)
    at org.springframework.data.neo4j.fieldaccess.RelatedToViaCollectionFieldAccessorFactory$RelatedToViaCollectionFieldAccessor.getValue(RelatedToViaCollectionFieldAccessorFactory.java:122)
    at org.springframework.data.neo4j.fieldaccess.DefaultEntityState.getValue(DefaultEntityState.java:97)

For example, this is my cypher query which tries to get a user node entity:

public MyUser getUserByUserId(String userId){
    Long t1 = System.currentTimeMillis();
    if(existsUserByUserId(userId)){
        HashedMap params = new HashedMap();
        params.put("userId", userId);
        String query = "START x=node:searchByUserId(userId = {userId})" +
                            " RETURN x";
        Result<Map<String,Object>> result = neo4jTemplate.query(query, params);
        MyUser user = result.to(MyUser.class).single();
        Long t2 = System.currentTimeMillis();
        logger.info("get user by user id exec time: " + (t2-t1) + " ms");
        return user;
    }
    Long t2 = System.currentTimeMillis();
    logger.info("get user by id exec time: " + (t2-t1) + " ms");
    return null;    
}

where searchByUserId is a node index and existsUserByUserId is a helper method which checks whether the the specified user exists or not. The problem is that when I try to call the result.to() method I get this error randomly. With randomly I mean that I'm not getting this error always. To be more concrete, I inserted all my node/relationships using the native Neo4j Java API and now I'm trying to retrieve these objects with Spring Data Neo4j (repository approach). This is how I'm inserting my node entities:

public Node createAndIndexMyUserNode(MyUser user){
        Map<String,Object> properties = new HashMap<String, Object>();
        properties.put("userId", user.getUserId());
        properties.put("baseID" , user.getBaseID());
        properties.put("__type__", MyUser.class.getName());
        properties.put("canUpdate", false);
        Node node = neo4jTemplate.getOrCreateNode("searchByUserId", "userId", user.getTwitterId(), properties);
        return node;
    }

This is probably the problem but I don't know how I could solve it. I suspect that bad database shutdowns or relationships creation (afterwards) could be also one reason, but I'm not sure though. This is the reason why I'm inserting "manually" all nodes instead of using the repository save method. Any suggestions or ideas?

Thank you all in advance!

Community
  • 1
  • 1
jarandaf
  • 4,297
  • 6
  • 38
  • 67
  • does it also happen when you load the `MyUser` via a repository or template call and not cypher? – Michael Hunger Apr 15 '13 at 20:48
  • 1
    Yes. I have fortunately found the bug in my code. I was using the @Fetch notation in my relationship entity, which caused infinite recursion. The "random" nature of this error had sense: nodes without relationships were properly retrieved and those ones with relationships failed. Everything working fine now! – jarandaf Apr 16 '13 at 11:06

0 Answers0