diff --git a/spring-data-graph-parent/pom.xml b/spring-data-graph-parent/pom.xml
index 407193e40..48d5cce02 100644
--- a/spring-data-graph-parent/pom.xml
+++ b/spring-data-graph-parent/pom.xml
@@ -16,7 +16,7 @@
1.8.4
1.5.10
3.0.5.RELEASE
- 1.0.0.M2
+ 1.0.0.BUILD-SNAPSHOT
1.2
1.2-${neo4j.version}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/annotation/NodeEntity.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/annotation/NodeEntity.java
index 79a65e061..2dd847b88 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/annotation/NodeEntity.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/annotation/NodeEntity.java
@@ -51,4 +51,11 @@ public @interface NodeEntity {
* @return true if the entity is only partially managed by the {@link org.springframework.data.graph.neo4j.support.node.Neo4jNodeBacking} aspect.
*/
boolean partial() default false;
+
+
+ /**
+ * if set the entity will be attached to the graph store at creation time, otherwise entity.attach() has to be called manually.
+ * @return
+ */
+ boolean autoAttach() default false;
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachableEntityStateAccessors.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachableEntityStateAccessors.java
index 4242ab39a..33853935a 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachableEntityStateAccessors.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachableEntityStateAccessors.java
@@ -182,6 +182,17 @@ public class DetachableEntityStateAccessors, S
public GraphDatabaseContext getGraphDatabaseContext() {
return graphDatabaseContext;
}
+
+ @Override
+ public ENTITY attach() {
+ if (graphDatabaseContext.transactionIsRunning()) {
+ return delegate.attach();
+ } else {
+ log.warn("New Nodebacked tried to attach outside of transaction " + delegate.getEntity().getClass());
+ return getEntity();
+ }
+ }
+
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/EntityStateAccessors.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/EntityStateAccessors.java
index 5d2388efe..046e7210d 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/EntityStateAccessors.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/EntityStateAccessors.java
@@ -57,4 +57,6 @@ public interface EntityStateAccessors,STATE> {
boolean hasUnderlyingState();
STATE getUnderlyingState();
+
+ ENTITY attach();
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/JpaIdFieldAccessListenerFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/JpaIdFieldAccessListenerFactory.java
index 1cae1e8a4..92ba47b72 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/JpaIdFieldAccessListenerFactory.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/JpaIdFieldAccessListenerFactory.java
@@ -47,7 +47,7 @@ public class JpaIdFieldAccessListenerFactory implements FieldAccessorListenerFac
public void valueChanged(NodeBacked nodeBacked, Object oldVal, Object newVal) {
if (newVal != null) {
EntityStateAccessors stateAccessors=nodeBacked.getStateAccessors();
- stateAccessors.createAndAssignState();
+ stateAccessors.attach();
}
}
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NestedTransactionEntityStateAccessors.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NestedTransactionEntityStateAccessors.java
index 667fd388a..07d91e374 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NestedTransactionEntityStateAccessors.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NestedTransactionEntityStateAccessors.java
@@ -7,84 +7,89 @@ import org.springframework.data.graph.core.GraphBacked;
import org.springframework.data.graph.neo4j.support.GraphDatabaseContext;
import java.lang.reflect.Field;
+import java.util.concurrent.Callable;
public class NestedTransactionEntityStateAccessors, STATE> implements
- EntityStateAccessors
-{
+ EntityStateAccessors {
protected final EntityStateAccessors delegate;
- private final static Log log = LogFactory.getLog( NestedTransactionEntityStateAccessors.class );
+ private final static Log log = LogFactory.getLog(NestedTransactionEntityStateAccessors.class);
private GraphDatabaseContext graphDatabaseContext;
- public NestedTransactionEntityStateAccessors( final EntityStateAccessors delegate,
- GraphDatabaseContext graphDatabaseContext )
- {
+ public NestedTransactionEntityStateAccessors(final EntityStateAccessors delegate,
+ GraphDatabaseContext graphDatabaseContext) {
this.delegate = delegate;
this.graphDatabaseContext = graphDatabaseContext;
}
@Override
- public ENTITY getEntity()
- {
+ public ENTITY getEntity() {
return delegate.getEntity();
}
- public void setUnderlyingState( STATE state )
- {
- delegate.setUnderlyingState( state );
+ public void setUnderlyingState(STATE state) {
+ delegate.setUnderlyingState(state);
}
@Override
- public Object getValue( Field field )
- {
- return delegate.getValue( field );
+ public Object getValue(Field field) {
+ return delegate.getValue(field);
}
@Override
- public boolean isWritable( Field field )
- {
- return delegate.isWritable( field );
+ public boolean isWritable(Field field) {
+ return delegate.isWritable(field);
}
@Override
- public Object setValue( Field field, Object newVal )
- {
- Transaction tx = graphDatabaseContext.beginTx();
-
- try
- {
- Object result = delegate.setValue( field, newVal );
- tx.success();
- return result;
- } finally
- {
- tx.finish();
- }
+ public Object setValue(final Field field, final Object newVal) {
+ return doInTransaction(new Callable