diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/AbstractNodeRelationshipFieldAccessor.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/AbstractNodeRelationshipFieldAccessor.java index bd1065ea4..7c2b95a25 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/AbstractNodeRelationshipFieldAccessor.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/AbstractNodeRelationshipFieldAccessor.java @@ -105,7 +105,8 @@ public abstract class AbstractNodeRelationshipFieldAccessor relationships = node.getRelationships(type, org.neo4j.graphdb.Direction.OUTGOING); + for (Relationship relationship : relationships) { + if (relationship.getOtherNode(node).equals(targetNode)) return relationship; + } + return null; + } + /** * @return node id or null if there is no underlying state */ @@ -184,7 +196,8 @@ public aspect Neo4jNodeBacking { // extends AbstractTypeAnnotatingMixinFields R NodeBacked.relateTo(N target, Class relationshipClass, String relationshipType) { - Relationship rel = this.getPersistentState().createRelationshipTo( target.getPersistentState(), DynamicRelationshipType.withName(relationshipType)); + DynamicRelationshipType type = DynamicRelationshipType.withName(relationshipType); + Relationship rel = this.relateTo(target,type); return (R)Neo4jNodeBacking.aspectOf().graphDatabaseContext.createEntityFromState(rel, relationshipClass); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/RelationshipEntityTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/RelationshipEntityTest.java index 9307fa0e3..ba56d71af 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/RelationshipEntityTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/RelationshipEntityTest.java @@ -6,6 +6,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.neo4j.graphdb.*; +import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.graph.neo4j.Friendship; import org.springframework.data.graph.neo4j.Person; @@ -49,6 +50,17 @@ public class RelationshipEntityTest { assertEquals(p2.getPersistentState(), rel.getEndNode()); } + @Test + @Transactional + public void shouldNotCreateSameRelationshipTwice() { + Person p = persistedPerson("Michael", 35); + Person p2 = persistedPerson("David", 25); + Friendship f = p.knows(p2); + Friendship f2 = p.knows(p2); + assertEquals(f, f2); + assertEquals(1, IteratorUtil.count(p.getFriendships())); + } + @Test @Transactional public void testRelationshipSetProperty() {