diff --git a/changelog.txt b/changelog.txt index 3243a57ca..443f9a248 100644 --- a/changelog.txt +++ b/changelog.txt @@ -16,6 +16,8 @@ Changes in version 1.0.0.M4 (2011-03-14) * added EntityEvaluator for entity based path evaluation * error handling for node type strategy called on non type nodes * FieldTraversalDescriptionBuilder build method parametrization +* re-enabled cross-store persistence +* removed the need to mark graph managed fields with @Transient for a cross store entity Changes in version 1.0.0.M3 (2011-02-25) ---------------------------------------- diff --git a/spring-data-graph-parent/pom.xml b/spring-data-graph-parent/pom.xml index 2a92334ff..dbedc3d67 100644 --- a/spring-data-graph-parent/pom.xml +++ b/spring-data-graph-parent/pom.xml @@ -327,6 +327,7 @@ maven-surefire-plugin 2.6 + always true **/*Tests.java diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/BackReferences.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/BackReferences.java index b26a7500f..b423621ee 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/BackReferences.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/BackReferences.java @@ -1,10 +1,8 @@ package org.springframework.data.graph.neo4j.fieldaccess; -import org.springframework.data.graph.annotation.RelatedTo; import org.springframework.data.graph.core.GraphBacked; import org.springframework.data.graph.core.NodeBacked; -import java.lang.reflect.Field; import java.util.*; /** diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java index 395e09ef3..ce2615b71 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java @@ -91,7 +91,7 @@ public abstract class DefaultEntityState, STAT return result; } - private FieldAccessor accessorFor(final Field field) { + protected FieldAccessor accessorFor(final Field field) { return fieldAccessors.get(field); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachedEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachedEntityState.java index 07444746a..a4646ec41 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachedEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DetachedEntityState.java @@ -79,7 +79,7 @@ public class DetachedEntityState, STATE> imple return delegate.getValue(field); } - private boolean isDetached() { + protected boolean isDetached() { return !transactionIsRunning() || !hasPersistentState() || isDirty(); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java index a747a110e..f36fdfe77 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java @@ -22,6 +22,8 @@ import org.springframework.data.graph.core.NodeBacked; import org.springframework.data.graph.neo4j.finder.FinderFactory; import org.springframework.data.graph.neo4j.support.GraphDatabaseContext; +import java.lang.reflect.Field; + import static org.springframework.data.graph.neo4j.fieldaccess.PartialNodeEntityState.getId; public class NodeEntityStateFactory { @@ -38,8 +40,8 @@ public class NodeEntityStateFactory { PartialNodeEntityState partialNodeEntityState = new PartialNodeEntityState(null, entity, entity.getClass(), graphDatabaseContext, finderFactory); return new DetachedEntityState(partialNodeEntityState, graphDatabaseContext) { @Override - protected boolean transactionIsRunning() { - return super.transactionIsRunning() && getId(entity, entity.getClass()) != null; + protected boolean isDetached() { + return super.isDetached() || getId(entity, entity.getClass()) == null; } }; } else { 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 89c4bd0eb..8deed8dcf 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 @@ -18,7 +18,6 @@ package org.springframework.data.graph.neo4j.fieldaccess; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.NotInTransactionException; -import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexHits; import org.springframework.dao.InvalidDataAccessResourceUsageException; @@ -141,6 +140,13 @@ public class PartialNodeEntityState extends DefaultEn return entity; } + @Override + public boolean isWritable(Field field) { + final FieldAccessor accessor = accessorFor(field); + if (accessor == null) return false; // difference to default behaviour, we don't care for non-managed fields here + return accessor.isWriteable(entity); + } + private void persistForeignId(Node node, Object id) { if (!node.hasProperty(FOREIGN_ID) && id != null) { final String foreignId = createForeignId(id); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/NodeFinder.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/NodeFinder.java index 796eabb59..ab6f45930 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/NodeFinder.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/NodeFinder.java @@ -17,7 +17,6 @@ package org.springframework.data.graph.neo4j.finder; import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; import org.springframework.data.graph.core.GraphBacked; import org.springframework.data.graph.core.NodeBacked; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/Neo4jNodeBacking.aj b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/Neo4jNodeBacking.aj index 902e7fcbb..81f31e08b 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/Neo4jNodeBacking.aj +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/node/Neo4jNodeBacking.aj @@ -30,6 +30,9 @@ import org.springframework.data.graph.core.RelationshipBacked; import org.springframework.data.graph.neo4j.fieldaccess.*; import org.springframework.data.graph.neo4j.support.GraphDatabaseContext; import org.springframework.data.graph.annotation.*; +import javax.persistence.Transient; +import javax.persistence.Entity; + import java.lang.reflect.Field; import static org.springframework.data.graph.neo4j.fieldaccess.DoReturn.unwrap; @@ -48,6 +51,13 @@ public aspect Neo4jNodeBacking { // extends AbstractTypeAnnotatingMixinFields recommendations; @RelatedTo(type = "friends", elementClass = User.class) - @Transient Set friends; public Recommendation rate(Restaurant restaurant, int stars, String comment) { diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest-context.xml index fd06c5e34..b86ea1633 100644 --- a/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest-context.xml +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest-context.xml @@ -37,7 +37,7 @@ method). Roo applications use this useful feature in a number of areas, such as @PersistenceContext injection into entities. --> - + - +