diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml index 85783ab36..67e930345 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml +++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml @@ -83,18 +83,23 @@ - + + + + + + + + + - - - @@ -133,39 +138,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springone/myrestaurants/data/UserAccountRelationshipsTest.java b/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springone/myrestaurants/data/UserAccountRelationshipsTest.java index 8cf50823b..15aaf3593 100644 --- a/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springone/myrestaurants/data/UserAccountRelationshipsTest.java +++ b/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springone/myrestaurants/data/UserAccountRelationshipsTest.java @@ -68,7 +68,6 @@ public class UserAccountRelationshipsTest extends AbstractTestWithUserAccount { @Transactional @Test - @Ignore public void testAddRecommendation() { UserAccount user = userAccountRepo.findUserAccount(userId); Restaurant rest = restaurantRepository.findRestaurant(22L); @@ -84,8 +83,9 @@ public class UserAccountRelationshipsTest extends AbstractTestWithUserAccount { Recommendation r = recommendations.get(0); Assert.assertEquals("recommendation should have correct rating", 3, r.getStars()); Assert.assertEquals("recommendation should have correct comment", "Pretty Good", r.getComment()); - Assert.assertEquals("recommendation should have correct restaurant id", new Long(22), r.getRestaurant().getId()); - Assert.assertEquals("recommendation should have correct restaurant name", "Subway Sandwiches & Salads", r.getRestaurant().getName()); + final Restaurant restaurant = r.getRestaurant(); + Assert.assertEquals("recommendation should have correct restaurant id", new Long(22), restaurant.getId()); + Assert.assertEquals("recommendation should have correct restaurant name", "Subway Sandwiches & Salads", restaurant.getName()); } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java index c1eb6d4af..eb8d2fd23 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java @@ -87,11 +87,16 @@ public abstract class Neo4jConfiguration { gdc.setGraphDatabaseService(getGraphDatabaseService()); gdc.setConversionService(conversionService()); gdc.setMappingContext(mappingContext()); - gdc.setNodeEntityStateFactory(nodeEntityStateFactory()); - gdc.setRelationshipEntityStateFactory(relationshipEntityStateFactory()); gdc.setEntityStateHandler(entityStateHandler()); + + gdc.setNodeEntityStateFactory(nodeEntityStateFactory()); gdc.setNodeTypeRepresentationStrategy(nodeTypeRepresentationStrategy()); + gdc.setNodeEntityInstantiator(graphEntityInstantiator()); + + gdc.setRelationshipEntityStateFactory(relationshipEntityStateFactory()); gdc.setRelationshipTypeRepresentationStrategy(relationshipTypeRepresentationStrategy()); + gdc.setRelationshipEntityInstantiator(graphRelationshipInstantiator()); + if (validator!=null) { gdc.setValidator(validator); } @@ -117,22 +122,23 @@ public abstract class Neo4jConfiguration { public EntityStateHandler entityStateHandler() { return new EntityStateHandler(mappingContext(),graphDatabaseService); } - - @Bean - public Neo4jEntityConverter nodeEntityConverter() throws Exception { - return new Neo4jEntityConverterImpl(mappingContext(), conversionService(), graphEntityInstantiator() ,entityStateHandler(),typeMapper(), nodeStateTransmitter(), entityFetchHandler()); - } - private TypeMapper typeMapper() throws Exception { + + @Bean + public TypeMapper nodeTypeMapper() throws Exception { return new DefaultTypeMapper(new TRSTypeAliasAccessor(nodeTypeRepresentationStrategy()),asList(new ClassValueTypeInformationMapper())); } + @Bean + public TypeMapper relationshipTypeMapper() throws Exception { + return new DefaultTypeMapper(new TRSTypeAliasAccessor(relationshipTypeRepresentationStrategy()),asList(new ClassValueTypeInformationMapper())); + } @Bean public Neo4jEntityFetchHandler entityFetchHandler() throws Exception { final SourceStateTransmitter nodeSourceStateTransmitter = nodeStateTransmitter(); final SourceStateTransmitter relationshipSourceStateTransmitter = new SourceStateTransmitter(relationshipEntityStateFactory()); - return new Neo4jEntityFetchHandler(entityStateHandler(), conversionService(), relationshipSourceStateTransmitter, nodeSourceStateTransmitter); + return new Neo4jEntityFetchHandler(entityStateHandler(), conversionService(), nodeSourceStateTransmitter, relationshipSourceStateTransmitter); } @Bean diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityConverterImpl.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityConverterImpl.java index 45fb33db6..36b464b1e 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityConverterImpl.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityConverterImpl.java @@ -25,6 +25,7 @@ import org.springframework.data.mapping.model.BeanWrapper; import org.springframework.data.mapping.model.MappingException; import org.springframework.data.neo4j.support.EntityInstantiator; import org.springframework.data.neo4j.support.EntityStateHandler; +import org.springframework.data.neo4j.support.EntityTools; import org.springframework.data.neo4j.support.ManagedEntity; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; @@ -43,16 +44,17 @@ public class Neo4jEntityConverterImpl implements private final TypeMapper typeMapper; private final SourceStateTransmitter sourceStateTransmitter; private final Neo4jEntityFetchHandler entityFetchHandler; - public Neo4jEntityConverterImpl(Neo4jMappingContext mappingContext, ConversionService conversionService, EntityInstantiator entityInstantiator, - EntityStateHandler entityStateHandler, TypeMapper typeMapper, - SourceStateTransmitter sourceStateTransmitter, Neo4jEntityFetchHandler entityFetchHandler) { + + public Neo4jEntityConverterImpl(Neo4jMappingContext mappingContext, ConversionService conversionService, + EntityStateHandler entityStateHandler, Neo4jEntityFetchHandler entityFetchHandler, + EntityTools entityTools) { this.mappingContext = mappingContext; this.conversionService = conversionService; - this.entityInstantiator = entityInstantiator; this.entityStateHandler = entityStateHandler; - this.typeMapper = typeMapper; - this.sourceStateTransmitter = sourceStateTransmitter; this.entityFetchHandler = entityFetchHandler; + this.entityInstantiator = new Neo4jEntityPersister.CachedInstantiator(entityTools.getEntityInstantiator()); + this.typeMapper = entityTools.getTypeMapper(); + this.sourceStateTransmitter = entityTools.getSourceStateTransmitter(); } @Override diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityFetchHandler.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityFetchHandler.java index 6b2bfa5b6..ff21045bd 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityFetchHandler.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityFetchHandler.java @@ -36,7 +36,7 @@ public class Neo4jEntityFetchHandler { private final EntityStateHandler entityStateHandler; private final ConversionService conversionService; - public Neo4jEntityFetchHandler(EntityStateHandler entityStateHandler, ConversionService conversionService, SourceStateTransmitter relationshipStateTransmitter, SourceStateTransmitter nodeStateTransmitter) { + public Neo4jEntityFetchHandler(EntityStateHandler entityStateHandler, ConversionService conversionService, SourceStateTransmitter nodeStateTransmitter, SourceStateTransmitter relationshipStateTransmitter) { this.conversionService = conversionService; this.entityStateHandler = entityStateHandler; this.relationshipStateTransmitter = relationshipStateTransmitter; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityPersister.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityPersister.java index 58c5055d6..c5902a0cc 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityPersister.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jEntityPersister.java @@ -15,27 +15,19 @@ */ package org.springframework.data.neo4j.mapping; -import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.Relationship; import org.springframework.core.convert.ConversionService; -import org.springframework.data.convert.DefaultTypeMapper; -import org.springframework.data.convert.TypeMapper; import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.neo4j.core.TypeRepresentationStrategy; import org.springframework.data.neo4j.support.EntityInstantiator; import org.springframework.data.neo4j.support.EntityStateHandler; +import org.springframework.data.neo4j.support.EntityTools; import org.springframework.data.neo4j.support.ManagedEntity; -import org.springframework.data.neo4j.support.node.EntityStateFactory; -import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; -import org.springframework.data.neo4j.support.relationship.RelationshipEntityInstantiator; import java.util.HashMap; import java.util.Map; -import static java.util.Arrays.asList; - /** * @author mh * @since 11.10.11 @@ -46,32 +38,16 @@ public class Neo4jEntityPersister implements Neo4jEntityConverter { private EntityStateHandler entityStateHandler; private final Neo4jMappingContext mappingContext; - - public Neo4jEntityPersister(GraphDatabaseService graphDatabaseService, Neo4jMappingContext mappingContext, ConversionService conversionService, - EntityStateFactory nodeEntityStateFactory, EntityStateFactory relationshipEntityStateFactory, - TypeRepresentationStrategy nodeTypeRepresentationStrategy, TypeRepresentationStrategy relationshipTypeRepresentationStrategy) { + public Neo4jEntityPersister(ConversionService conversionService, EntityTools nodeEntityTools, EntityTools relationshipEntityTools, Neo4jMappingContext mappingContext, EntityStateHandler entityStateHandler) { this.mappingContext = mappingContext; + this.entityStateHandler = entityStateHandler; - this.entityStateHandler = new EntityStateHandler(mappingContext, graphDatabaseService); + Neo4jEntityFetchHandler fetchHandler=new Neo4jEntityFetchHandler(entityStateHandler, conversionService, nodeEntityTools.getSourceStateTransmitter(), relationshipEntityTools.getSourceStateTransmitter()); - final EntityInstantiator nodeEntityInstantiator = new CachedInstantiator(new NodeEntityInstantiator(entityStateHandler)); - TypeMapper nodeTypeMapper = new DefaultTypeMapper(new TRSTypeAliasAccessor(nodeTypeRepresentationStrategy), asList(new ClassValueTypeInformationMapper())); - SourceStateTransmitter nodeStateTransmitter = new SourceStateTransmitter(nodeEntityStateFactory); + this.nodeConverter = new CachedConverter(new Neo4jEntityConverterImpl(mappingContext, conversionService, entityStateHandler, fetchHandler, nodeEntityTools)); - final EntityInstantiator relationshipEntityInstantiator = new CachedInstantiator(new RelationshipEntityInstantiator(entityStateHandler)); - TypeMapper relationShipTypeMapper = new DefaultTypeMapper(new TRSTypeAliasAccessor(relationshipTypeRepresentationStrategy), asList(new ClassValueTypeInformationMapper())); - SourceStateTransmitter relationshipStateTransmitter = new SourceStateTransmitter(relationshipEntityStateFactory); + this.relationshipConverter = new CachedConverter(new Neo4jEntityConverterImpl(mappingContext, conversionService, entityStateHandler, fetchHandler, relationshipEntityTools)); - Neo4jEntityFetchHandler fetchHandler=new Neo4jEntityFetchHandler(entityStateHandler, conversionService, relationshipStateTransmitter , nodeStateTransmitter); - - this.nodeConverter = new CachedConverter( - new Neo4jEntityConverterImpl(mappingContext, conversionService, nodeEntityInstantiator, - entityStateHandler, nodeTypeMapper, nodeStateTransmitter, fetchHandler)); - - this.relationshipConverter = new CachedConverter( - new Neo4jEntityConverterImpl(mappingContext, conversionService, - relationshipEntityInstantiator, entityStateHandler, relationShipTypeMapper, - relationshipStateTransmitter, fetchHandler)); } public T createEntityFromStoredType(S state) { @@ -113,10 +89,10 @@ public class Neo4jEntityPersister implements Neo4jEntityConverter { return cache().objects.containsKey(state); } } - static class CachedInstantiator implements EntityInstantiator { + public static class CachedInstantiator implements EntityInstantiator { private final EntityInstantiator delegate; - CachedInstantiator(EntityInstantiator delegate) { + public CachedInstantiator(EntityInstantiator delegate) { this.delegate = delegate; } @@ -132,10 +108,10 @@ public class Neo4jEntityPersister implements Neo4jEntityConverter { } } } - static class CachedConverter implements Neo4jEntityConverter { + public static class CachedConverter implements Neo4jEntityConverter { private final Neo4jEntityConverter delegate; - CachedConverter(Neo4jEntityConverter delegate) { + public CachedConverter(Neo4jEntityConverter delegate) { this.delegate = delegate; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityTools.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityTools.java new file mode 100644 index 000000000..a655f06f9 --- /dev/null +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityTools.java @@ -0,0 +1,67 @@ +/** + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.neo4j.support; + +import org.neo4j.graphdb.PropertyContainer; +import org.springframework.data.convert.DefaultTypeMapper; +import org.springframework.data.convert.TypeMapper; +import org.springframework.data.neo4j.core.TypeRepresentationStrategy; +import org.springframework.data.neo4j.mapping.ClassValueTypeInformationMapper; +import org.springframework.data.neo4j.mapping.SourceStateTransmitter; +import org.springframework.data.neo4j.mapping.TRSTypeAliasAccessor; +import org.springframework.data.neo4j.support.node.EntityStateFactory; + +import static java.util.Arrays.asList; + +/** + * @author mh + * @since 13.10.11 + */ +public class EntityTools { + private TypeRepresentationStrategy typeRepresentationStrategy; + private EntityStateFactory entityStateFactory; + private EntityInstantiator entityInstantiator; + private SourceStateTransmitter sourceStateTransmitter; + private TypeMapper typeMapper; + + public EntityTools(TypeRepresentationStrategy typeRepresentationStrategy, EntityStateFactory entityStateFactory, EntityInstantiator entityInstantiator) { + this.typeRepresentationStrategy = typeRepresentationStrategy; + this.entityStateFactory = entityStateFactory; + this.entityInstantiator = entityInstantiator; + this.sourceStateTransmitter = new SourceStateTransmitter(entityStateFactory); + this.typeMapper = new DefaultTypeMapper(new TRSTypeAliasAccessor(typeRepresentationStrategy), asList(new ClassValueTypeInformationMapper())); + } + + public TypeRepresentationStrategy getTypeRepresentationStrategy() { + return typeRepresentationStrategy; + } + + public EntityStateFactory getEntityStateFactory() { + return entityStateFactory; + } + + public EntityInstantiator getEntityInstantiator() { + return entityInstantiator; + } + + public SourceStateTransmitter getSourceStateTransmitter() { + return sourceStateTransmitter; + } + + public TypeMapper getTypeMapper() { + return typeMapper; + } +} diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java index a5e88f209..041807a35 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java @@ -37,7 +37,9 @@ import org.springframework.data.neo4j.mapping.Neo4jEntityPersister; import org.springframework.data.neo4j.mapping.Neo4jMappingContext; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.node.EntityStateFactory; +import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; import org.springframework.data.neo4j.support.query.CypherQueryExecutor; +import org.springframework.data.neo4j.support.relationship.RelationshipEntityInstantiator; import org.springframework.data.util.TypeInformation; import javax.annotation.PostConstruct; @@ -77,6 +79,18 @@ public class GraphDatabaseContext { private EntityStateFactory relationshipEntityStateFactory; private EntityRemover entityRemover; private TypeRepresentationStrategies typeRepresentationStrategies; + private EntityInstantiator relationshipEntityInstantiator; + private EntityInstantiator nodeEntityInstantiator; + private EntityTools nodeEntityTools; + private EntityTools relationshipEntityTools; + + public void setRelationshipEntityInstantiator(EntityInstantiator relationshipEntityInstantiator) { + this.relationshipEntityInstantiator = relationshipEntityInstantiator; + } + + public void setNodeEntityInstantiator(EntityInstantiator nodeEntityInstantiator) { + this.nodeEntityInstantiator = nodeEntityInstantiator; + } static class IndexProvider { private IndexManager indexManager; @@ -270,9 +284,17 @@ public class GraphDatabaseContext { public void postConstruct() { this.typeRepresentationStrategies = new TypeRepresentationStrategies(mappingContext, nodeTypeRepresentationStrategy, relationshipTypeRepresentationStrategy); this.cypherQueryExecutor = new CypherQueryExecutor(this); - this.entityPersister = new Neo4jEntityPersister(graphDatabaseService, mappingContext, conversionService, - nodeEntityStateFactory, relationshipEntityStateFactory, nodeTypeRepresentationStrategy, relationshipTypeRepresentationStrategy); - this.entityRemover = new EntityRemover(entityStateHandler, nodeTypeRepresentationStrategy, relationshipTypeRepresentationStrategy, graphDatabaseService.index()); + final EntityStateHandler entityStateHandler = new EntityStateHandler(mappingContext, graphDatabaseService); + if (nodeEntityInstantiator==null) { + nodeEntityInstantiator = new NodeEntityInstantiator(entityStateHandler); + } + this.nodeEntityTools = new EntityTools(nodeTypeRepresentationStrategy,nodeEntityStateFactory, nodeEntityInstantiator); + if (relationshipEntityInstantiator==null) { + relationshipEntityInstantiator = new RelationshipEntityInstantiator(entityStateHandler); + } + this.relationshipEntityTools = new EntityTools(relationshipTypeRepresentationStrategy, relationshipEntityStateFactory, relationshipEntityInstantiator); + this.entityPersister = new Neo4jEntityPersister(conversionService, nodeEntityTools,relationshipEntityTools,mappingContext, entityStateHandler); + this.entityRemover = new EntityRemover(this.entityStateHandler, nodeTypeRepresentationStrategy, relationshipTypeRepresentationStrategy, graphDatabaseService.index()); this.indexProvider = new IndexProvider(graphDatabaseService.index(), mappingContext); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jPersistentTestBase.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jPersistentTestBase.java index ca53685d1..86dcce699 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jPersistentTestBase.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jPersistentTestBase.java @@ -31,6 +31,7 @@ import org.springframework.data.neo4j.fieldaccess.RelationshipDelegatingFieldAcc import org.springframework.data.neo4j.model.Group; import org.springframework.data.neo4j.model.Person; import org.springframework.data.neo4j.support.EntityStateHandler; +import org.springframework.data.neo4j.support.EntityTools; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; import org.springframework.data.neo4j.support.node.NodeEntityStateFactory; @@ -52,12 +53,12 @@ import static java.util.Arrays.asList; */ public class Neo4jPersistentTestBase { private Transaction tx; - private Neo4jEntityConverterImpl nodeConverter; protected GraphDatabaseContext gdc; protected NodeEntityStateFactory nodeEntityStateFactory; protected RelationshipEntityStateFactory relationshipEntityStateFactory; protected EntityStateHandler entityStateHandler; protected NodeEntityInstantiator nodeEntityInstantiator; + protected RelationshipEntityInstantiator relationshipEntityInstantiator; protected TypeMapper nodeTypeMapper; protected SourceStateTransmitter nodeStateTransmitter; protected SourceStateTransmitter relationshipStateTransmitter; @@ -97,17 +98,17 @@ public class Neo4jPersistentTestBase { entityStateHandler = gdc.getEntityStateHandler(); nodeEntityInstantiator = new NodeEntityInstantiator(entityStateHandler); + relationshipEntityInstantiator = new RelationshipEntityInstantiator(entityStateHandler); nodeTypeMapper = new DefaultTypeMapper(new TRSTypeAliasAccessor(gdc.getNodeTypeRepresentationStrategy()),asList(new ClassValueTypeInformationMapper())); nodeStateTransmitter = new SourceStateTransmitter(nodeEntityStateFactory); relationshipStateTransmitter = new SourceStateTransmitter(relationshipEntityStateFactory); conversionService = gdc.getConversionService(); - fetchHandler = new Neo4jEntityFetchHandler(entityStateHandler, conversionService, relationshipStateTransmitter, nodeStateTransmitter); - nodeConverter = new Neo4jEntityConverterImpl(mappingContext, conversionService, nodeEntityInstantiator, entityStateHandler, nodeTypeMapper, nodeStateTransmitter, fetchHandler); + fetchHandler = new Neo4jEntityFetchHandler(entityStateHandler, conversionService, nodeStateTransmitter, relationshipStateTransmitter); + final EntityTools nodeEntityTools = new EntityTools(gdc.getNodeTypeRepresentationStrategy(), nodeEntityStateFactory, nodeEntityInstantiator); + final EntityTools relationshipEntityTools = new EntityTools(gdc.getRelationshipTypeRepresentationStrategy(), relationshipEntityStateFactory, relationshipEntityInstantiator); - entityPersister = new Neo4jEntityPersister(gdc.getGraphDatabaseService(), mappingContext, conversionService, - nodeEntityStateFactory, relationshipEntityStateFactory, - gdc.getNodeTypeRepresentationStrategy(), gdc.getRelationshipTypeRepresentationStrategy()); + entityPersister = new Neo4jEntityPersister(conversionService, nodeEntityTools, relationshipEntityTools, mappingContext, entityStateHandler); group = new Group(); michael = new Person("Michael", 37);