From b4c86c83b734094807c0f23edda0c3cdb320609e Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 15 Mar 2011 01:51:05 +0100 Subject: [PATCH] fixed entity-manager-issue with cross-store --- .../graph/neo4j/config/Neo4jConfiguration.java | 7 +++++-- .../neo4j/fieldaccess/PartialNodeEntityState.java | 1 - .../node/PartialNeo4jEntityInstantiator.java | 14 ++++++++++---- .../graph/neo4j/partial/RecommendationTest.java | 3 ++- .../Neo4jGraphRecommendationTest-context.xml | 5 +---- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/config/Neo4jConfiguration.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/config/Neo4jConfiguration.java index de5d44ec1..331903284 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/config/Neo4jConfiguration.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/config/Neo4jConfiguration.java @@ -35,11 +35,14 @@ import org.springframework.data.graph.neo4j.support.node.Neo4jNodeBacking; import org.springframework.data.graph.neo4j.support.node.PartialNeo4jEntityInstantiator; import org.springframework.data.graph.neo4j.support.relationship.ConstructorBypassingGraphRelationshipInstantiator; import org.springframework.data.graph.neo4j.support.relationship.Neo4jRelationshipBacking; +import org.springframework.data.graph.neo4j.transaction.ChainedTransactionManager; +import org.springframework.orm.jpa.EntityManagerFactoryUtils; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.persistence.transaction.NaiveDoubleTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; +import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.validation.Validator; @@ -88,7 +91,7 @@ public class Neo4jConfiguration { gdc.setGraphDatabaseService(getGraphDatabaseService()); gdc.setRelationshipEntityInstantiator(new ConstructorBypassingGraphRelationshipInstantiator()); if (isUsingCrossStorePersistence()) { - gdc.setGraphEntityInstantiator(new PartialNeo4jEntityInstantiator(new Neo4jConstructorGraphEntityInstantiator(), getEntityManagerFactory().createEntityManager())); + gdc.setGraphEntityInstantiator(new PartialNeo4jEntityInstantiator(new Neo4jConstructorGraphEntityInstantiator(), entityManagerFactory)); } else { gdc.setGraphEntityInstantiator(new Neo4jConstructorGraphEntityInstantiator()); @@ -137,7 +140,7 @@ public class Neo4jConfiguration { JtaTransactionManager jtaTm = new JtaTransactionManager(); jtaTm.setTransactionManager(new SpringTransactionManager(getGraphDatabaseService())); jtaTm.setUserTransaction(new UserTransactionImpl(getGraphDatabaseService())); - return new NaiveDoubleTransactionManager(jpaTm, jtaTm); + return new ChainedTransactionManager(jpaTm, jtaTm); } else { PlatformTransactionManager transactionManager = new JtaTransactionManager(); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java index 8deed8dcf..bb680595e 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java @@ -117,7 +117,6 @@ public class PartialNodeEntityState extends DefaultEn node = graphDatabaseContext.createNode(); persistForeignId(node, id); setPersistentState(node); - entity.setPersistentState(node); log.info("User-defined constructor called on class " + entity.getClass() + "; created Node [" + entity.getPersistentState() + "]; Updating metamodel"); graphDatabaseContext.postEntityCreation(entity); } else { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/PartialNeo4jEntityInstantiator.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/PartialNeo4jEntityInstantiator.java index 8a61c6a9a..3a511de90 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/PartialNeo4jEntityInstantiator.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/PartialNeo4jEntityInstantiator.java @@ -19,9 +19,11 @@ package org.springframework.data.graph.neo4j.support.node; import org.neo4j.graphdb.Node; import org.springframework.data.graph.core.NodeBacked; import org.springframework.data.graph.neo4j.fieldaccess.PartialNodeEntityState; +import org.springframework.orm.jpa.EntityManagerFactoryUtils; import org.springframework.persistence.support.EntityInstantiator; import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; /** * Entity instantiator for Node entities that takes into account that the entity is persisted in a JPA store as well. @@ -32,12 +34,12 @@ import javax.persistence.EntityManager; public class PartialNeo4jEntityInstantiator implements EntityInstantiator { private final Neo4jConstructorGraphEntityInstantiator delegate; + private EntityManagerFactory entityManagerFactory; - private final EntityManager entityManager; - public PartialNeo4jEntityInstantiator(Neo4jConstructorGraphEntityInstantiator delegate, EntityManager entityManager) { + public PartialNeo4jEntityInstantiator(Neo4jConstructorGraphEntityInstantiator delegate, EntityManagerFactory entityManagerFactory) { this.delegate = delegate; - this.entityManager = entityManager; + this.entityManagerFactory = entityManagerFactory; } /** @@ -52,10 +54,14 @@ public class PartialNeo4jEntityInstantiator implements EntityInstantiator T createEntityFromState(Node n, Class entityClass) { if (n.hasProperty(PartialNodeEntityState.FOREIGN_ID)) { final Object foreignId = n.getProperty(PartialNodeEntityState.FOREIGN_ID); - final T result = entityManager.find(entityClass, foreignId); + final T result = entityManager().find(entityClass, foreignId); result.setPersistentState(n); return result; } return delegate.createEntityFromState(n, entityClass); } + + private EntityManager entityManager() { + return EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory); + } } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/partial/RecommendationTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/partial/RecommendationTest.java index e36350a1c..e602bdc46 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/partial/RecommendationTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/partial/RecommendationTest.java @@ -81,7 +81,8 @@ public class RecommendationTest { Assert.assertNotNull("jpa-id",user.getId()); Assert.assertNotNull("node",user.getPersistentState()); User user2 = user("Jane"); - user.knows(user2); + user.getFriends().add(user2); + //user.knows(user2); Assert.assertEquals(user2, user.getFriends().iterator().next()); } } diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml index 7364ae7c6..3f0482541 100644 --- a/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml @@ -80,9 +80,6 @@ - @@ -99,7 +96,7 @@ - +