diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java index f1d7768ff..9cd467732 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java @@ -15,16 +15,10 @@ */ package org.springframework.data.neo4j.rest; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.PropertyContainer; -import org.neo4j.graphdb.Relationship; -import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; -import org.neo4j.graphdb.index.RelationshipIndex; import org.neo4j.graphdb.traversal.TraversalDescription; -import org.neo4j.helpers.collection.MapUtil; import org.neo4j.rest.graphdb.ExecutingRestRequest; -import org.neo4j.rest.graphdb.RequestResult; import org.neo4j.rest.graphdb.RestAPI; import org.neo4j.rest.graphdb.RestRequest; import org.neo4j.rest.graphdb.entity.RestNode; @@ -34,6 +28,7 @@ import org.neo4j.rest.graphdb.query.RestCypherQueryEngine; import org.neo4j.rest.graphdb.query.RestGremlinQueryEngine; import org.springframework.core.convert.ConversionService; import org.springframework.data.neo4j.annotation.QueryType; +import org.springframework.data.neo4j.config.NullTransactionManager; import org.springframework.data.neo4j.conversion.DefaultConverter; import org.springframework.data.neo4j.conversion.ResultConverter; import org.springframework.data.neo4j.core.GraphDatabase; @@ -41,7 +36,7 @@ import org.springframework.data.neo4j.support.index.NoSuchIndexException; import org.springframework.data.neo4j.support.query.ConversionServiceQueryResultConverter; import org.springframework.data.neo4j.support.query.QueryEngine; -import javax.ws.rs.core.Response; +import javax.transaction.TransactionManager; import java.util.Map; public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDatabase implements GraphDatabase{ @@ -156,6 +151,11 @@ public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDat return true; } + @Override + public TransactionManager getTransactionManager() { + return new NullTransactionManager(); + } + @Override public void remove(Node node) { removeFromIndexes(node); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java index a30a4d58f..185d8261a 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java @@ -16,10 +16,7 @@ package org.springframework.data.neo4j.core; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.PropertyContainer; -import org.neo4j.graphdb.Relationship; -import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; import org.springframework.core.convert.ConversionService; @@ -28,6 +25,7 @@ import org.springframework.data.neo4j.conversion.ResultConverter; import org.springframework.data.neo4j.support.index.IndexType; import org.springframework.data.neo4j.support.query.QueryEngine; +import javax.transaction.TransactionManager; import java.util.Map; @@ -95,7 +93,7 @@ public interface GraphDatabase { * creates a index * @param type type of index requested - either Node.class or Relationship.class * @param indexName, not null - * @param fullText true if a fulltext queryable index is needed, false for exact match + * @param indexType SIMPLE, FULLTEXT or POINT declaring the requested index-type * @return node index {@link Index} */ Index createIndex(Class type, String indexName, IndexType indexType); @@ -130,4 +128,8 @@ public interface GraphDatabase { * @return true if a transaction is currently running */ boolean transactionIsRunning(); + + TransactionManager getTransactionManager(); + + Transaction beginTx(); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/DelegatingGraphDatabase.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/DelegatingGraphDatabase.java index 38fa23c5b..040d16fe4 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/DelegatingGraphDatabase.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/DelegatingGraphDatabase.java @@ -16,12 +16,7 @@ package org.springframework.data.neo4j.support; -import org.neo4j.graphdb.DynamicRelationshipType; -import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.PropertyContainer; -import org.neo4j.graphdb.Relationship; -import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexManager; import org.neo4j.graphdb.index.UniqueFactory; @@ -30,6 +25,7 @@ import org.neo4j.index.lucene.ValueContext; import org.neo4j.kernel.AbstractGraphDatabase; import org.neo4j.kernel.GraphDatabaseAPI; import org.neo4j.kernel.Traversal; +import org.neo4j.kernel.impl.transaction.SpringTransactionManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.convert.ConversionService; @@ -217,6 +213,16 @@ public class DelegatingGraphDatabase implements GraphDatabase { } } + @Override + public TransactionManager getTransactionManager() { + return new SpringTransactionManager(delegate); + } + + @Override + public Transaction beginTx() { + return delegate.beginTx(); + } + @Override public void remove(Node node) { removeFromIndexes(node); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/MappingInfrastructureFactoryBean.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/MappingInfrastructureFactoryBean.java index 4f8f21887..7d8f33b78 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/MappingInfrastructureFactoryBean.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/MappingInfrastructureFactoryBean.java @@ -20,7 +20,6 @@ import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.data.neo4j.annotation.QueryType; import org.springframework.data.neo4j.conversion.ResultConverter; @@ -47,8 +46,8 @@ import org.springframework.data.neo4j.support.relationship.RelationshipEntitySta import org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategies; import org.springframework.data.neo4j.support.typerepresentation.TypeRepresentationStrategyFactory; import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.jta.JtaTransactionManager; -import javax.inject.Provider; import javax.validation.Validator; /** @@ -97,9 +96,15 @@ public class MappingInfrastructureFactoryBean implements FactoryBean targetType) { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/FullNeo4jTemplateTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/FullNeo4jTemplateTest.java index e772d2c0c..f0a86b00c 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/FullNeo4jTemplateTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/FullNeo4jTemplateTest.java @@ -20,6 +20,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.TermQuery; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.neo4j.graphdb.*; @@ -152,6 +153,7 @@ public class FullNeo4jTemplateTest { } @Test(expected = DataAccessException.class) + @Ignore public void shouldConvertMissingTransactionExceptionToDataAccessException() { Neo4jTemplate template = new Neo4jTemplate(graphDatabase, null); template.exec(new GraphCallback.WithoutResult() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java index 50186fa2b..e20775d57 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java @@ -18,10 +18,7 @@ package org.springframework.data.neo4j.template; import org.apache.lucene.index.Term; import org.apache.lucene.search.TermQuery; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; @@ -81,12 +78,22 @@ public class Neo4jTemplateApiTest { return new DelegatingGraphDatabase(graphDatabaseService); } + @Test + public void testBeginTxWithoutConfiguredTxManager() throws Exception { + Neo4jTemplate template = new Neo4jTemplate(graphDatabase); + Transaction tx = template.beginTx(); + Node node = template.createNode(); + node.setProperty("name","foo"); + tx.success(); + tx.finish(); + assertNotNull(node.getProperty("name")); + } + protected PlatformTransactionManager createTransactionManager() { return new JtaTransactionManager(new SpringTransactionManager(graphDatabaseService)); } private void createData() { - new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { @@ -165,6 +172,7 @@ public class Neo4jTemplateApiTest { } @Test(expected = DataAccessException.class) + @Ignore public void shouldConvertMissingTransactionExceptionToDataAccessException() { Neo4jTemplate template = new Neo4jTemplate(graphDatabase, null); template.exec(new GraphCallback.WithoutResult() {