diff --git a/spring-data-neo4j-examples/cineasts-aspects/pom.xml b/spring-data-neo4j-examples/cineasts-aspects/pom.xml
index 6210c014e..4c366c464 100644
--- a/spring-data-neo4j-examples/cineasts-aspects/pom.xml
+++ b/spring-data-neo4j-examples/cineasts-aspects/pom.xml
@@ -3,11 +3,11 @@
4.0.0
org.neo4j.examples
- movies-aspects
+ cineasts-aspects
2.0-SNAPSHOT
war
- Movies
+ Cineasts.net Aspects
UTF-8
diff --git a/spring-data-neo4j-examples/cineasts-rest/pom.xml b/spring-data-neo4j-examples/cineasts-rest/pom.xml
index 5ecf50177..a29285f9c 100644
--- a/spring-data-neo4j-examples/cineasts-rest/pom.xml
+++ b/spring-data-neo4j-examples/cineasts-rest/pom.xml
@@ -3,11 +3,11 @@
4.0.0
org.neo4j
- movies-rest
+ cineasts-rest
2.0-SNAPSHOT
war
- Movies over REST
+ Cineasts over REST
UTF-8
diff --git a/spring-data-neo4j-examples/cineasts/.gitignore b/spring-data-neo4j-examples/cineasts/.gitignore
new file mode 100644
index 000000000..490bd87be
--- /dev/null
+++ b/spring-data-neo4j-examples/cineasts/.gitignore
@@ -0,0 +1,12 @@
+.DS_Store
+*.ipr
+*.iws
+*.iml
+*.zip
+data
+target
+*.log
+tmp
+.classpath
+.project
+.settings
diff --git a/spring-data-neo4j-examples/cineasts/pom.xml b/spring-data-neo4j-examples/cineasts/pom.xml
index c3b54477b..604f38d00 100644
--- a/spring-data-neo4j-examples/cineasts/pom.xml
+++ b/spring-data-neo4j-examples/cineasts/pom.xml
@@ -7,7 +7,7 @@
2.0-SNAPSHOT
war
- Movies
+ Cineasts.net
UTF-8
@@ -16,7 +16,6 @@
UTF-8
1.5.M02
2.0.0.BUILD-SNAPSHOT
- 1.6.12.M1
1.6.1
@@ -176,7 +175,7 @@
org.springframework.data
- spring-data-neo4j-aspects
+ spring-data-neo4j
${spring-data-graph.version}
@@ -222,11 +221,11 @@
1.7.2
-
+
cglib
@@ -234,12 +233,6 @@
2.2
-
- org.hibernate.javax.persistence
- hibernate-jpa-2.0-api
- 1.0.0.Final
-
-
@@ -318,7 +311,7 @@
-
+
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/controller/MovieController.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/controller/MovieController.java
index ddfa15478..b61cd3954 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/controller/MovieController.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/controller/MovieController.java
@@ -6,7 +6,7 @@ import org.neo4j.cineasts.domain.Rating;
import org.neo4j.cineasts.domain.User;
import org.neo4j.cineasts.repository.MovieRepository;
import org.neo4j.cineasts.repository.PersonRepository;
-import org.neo4j.cineasts.service.CineastsRepository;
+import org.neo4j.cineasts.repository.UserRepository;
import org.neo4j.cineasts.service.CineastsUserDetailsService;
import org.neo4j.cineasts.service.DatabasePopulator;
import org.neo4j.helpers.collection.IteratorUtil;
@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
+import org.springframework.data.neo4j.template.Neo4jOperations;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@@ -34,8 +35,12 @@ public class MovieController {
@Autowired
private PersonRepository personRepository;
@Autowired
+ private UserRepository userRepository;
+ @Autowired
private CineastsUserDetailsService userDetailsService;
@Autowired
+ Neo4jOperations template;
+ @Autowired
private DatabasePopulator populator;
private static final Logger log = LoggerFactory.getLogger(MovieController.class);
@@ -61,7 +66,7 @@ public class MovieController {
final int stars = movie.getStars();
model.addAttribute("stars", stars);
Rating rating = null;
- if (user!=null) rating = movie.getRelationshipTo(user, Rating.class, "RATED");
+ if (user!=null) rating = template.getRelationshipBetween(movie, user, Rating.class, "RATED");
if (rating == null) rating = new Rating().rate(stars,null);
model.addAttribute("userRating",rating);
}
@@ -75,7 +80,7 @@ public class MovieController {
if (user != null && movie != null) {
int stars1 = stars==null ? -1 : stars;
String comment1 = comment!=null ? comment.trim() : null;
- user.rate(movie, stars1, comment1);
+ user.rate(template,movie, stars1, comment1);
}
return singleMovieView(model,movieId);
}
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java
index fdad46ad6..c7e4f4fe0 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java
@@ -1,11 +1,7 @@
package org.neo4j.cineasts.domain;
-import org.neo4j.graphdb.Direction;
import org.neo4j.helpers.collection.IteratorUtil;
-import org.springframework.data.neo4j.annotation.NodeEntity;
-import org.springframework.data.neo4j.annotation.RelatedTo;
-import org.springframework.data.neo4j.annotation.RelatedToVia;
-import org.springframework.data.neo4j.annotation.Indexed;
+import org.springframework.data.neo4j.annotation.*;
import org.springframework.data.neo4j.support.index.IndexType;
import java.util.*;
@@ -19,6 +15,7 @@ import static org.neo4j.graphdb.Direction.INCOMING;
*/
@NodeEntity
public class Movie {
+ @GraphId Long nodeId;
@Indexed
String id;
@@ -34,11 +31,11 @@ public class Movie {
@RelatedTo(type = "ACTS_IN", direction = INCOMING)
Set actors;
- @RelatedToVia(elementClass = Role.class, type = "ACTS_IN", direction = INCOMING)
+ @RelatedToVia(type = "ACTS_IN", direction = INCOMING)
Iterable roles;
- @RelatedToVia(elementClass = Rating.class, type = "RATED", direction = INCOMING)
- Iterable ratings;
+ @RelatedToVia(type = "RATED", direction = INCOMING)
+ @Fetch Iterable ratings;
private String language;
private String imdbId;
private String tagline;
@@ -224,5 +221,22 @@ public class Movie {
int numberOfParts = parts.length;
return numberOfParts > 0 ? parts[numberOfParts-1] : null;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Movie movie = (Movie) o;
+ if (nodeId == null) return super.equals(o);
+ return nodeId.equals(movie.nodeId);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return nodeId != null ? nodeId.hashCode() : super.hashCode();
+ }
+
}
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java
index 9cb5e9698..f2df05154 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java
@@ -1,12 +1,11 @@
package org.neo4j.cineasts.domain;
-import org.springframework.data.neo4j.annotation.Indexed;
-import org.springframework.data.neo4j.annotation.NodeEntity;
-import org.springframework.data.neo4j.annotation.RelatedTo;
-import org.springframework.data.neo4j.annotation.RelatedToVia;
+import org.springframework.data.neo4j.annotation.*;
import org.springframework.data.neo4j.support.index.IndexType;
+import org.springframework.data.neo4j.template.Neo4jOperations;
import java.util.Date;
+import java.util.HashSet;
import java.util.Set;
/**
@@ -15,6 +14,7 @@ import java.util.Set;
*/
@NodeEntity
public class Person {
+ @GraphId Long nodeId;
@Indexed
String id;
@Indexed(indexType=IndexType.FULLTEXT, indexName = "people")
@@ -100,7 +100,7 @@ public class Person {
}
@RelatedTo(elementClass = Movie.class, type = "DIRECTED")
- private Set directedMovies;
+ private Set directedMovies=new HashSet();
public Set getDirectedMovies() {
return directedMovies;
@@ -117,10 +117,27 @@ public class Person {
return roles;
}
- public Role playedIn(Movie movie, String roleName) {
- Role role = relateTo(movie, Role.class, "ACTS_IN");
+ public Role playedIn(Neo4jOperations template,Movie movie, String roleName) {
+ Role role = template.createRelationshipBetween(this, movie, Role.class, "ACTS_IN",false);
role.setName(roleName);
- return role;
+ return template.save(role);
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Person person = (Person) o;
+ if (nodeId == null) return super.equals(o);
+ return nodeId.equals(person.nodeId);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return nodeId != null ? nodeId.hashCode() : super.hashCode();
+ }
+
+
}
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Rating.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Rating.java
index ea14ea5f9..7ccd2eda7 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Rating.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Rating.java
@@ -1,8 +1,6 @@
package org.neo4j.cineasts.domain;
-import org.springframework.data.neo4j.annotation.EndNode;
-import org.springframework.data.neo4j.annotation.RelationshipEntity;
-import org.springframework.data.neo4j.annotation.StartNode;
+import org.springframework.data.neo4j.annotation.*;
/**
* @author mh
@@ -12,9 +10,9 @@ import org.springframework.data.neo4j.annotation.StartNode;
public class Rating {
private static final int MAX_STARS = 5;
private static final int MIN_STARS = 0;
+ @GraphId Long id;
- @StartNode
- User user;
+ @StartNode User user;
@EndNode Movie movie;
int stars;
@@ -49,4 +47,21 @@ public class Rating {
if (comment!=null && !comment.isEmpty()) this.comment = comment;
return this;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Rating rating = (Rating) o;
+ if (id == null) return super.equals(o);
+ return id.equals(rating.id);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return id != null ? id.hashCode() : super.hashCode();
+ }
+
}
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java
index e5a4dac27..97f84680d 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java
@@ -1,6 +1,7 @@
package org.neo4j.cineasts.domain;
import org.springframework.data.neo4j.annotation.EndNode;
+import org.springframework.data.neo4j.annotation.GraphId;
import org.springframework.data.neo4j.annotation.RelationshipEntity;
import org.springframework.data.neo4j.annotation.StartNode;
@@ -10,6 +11,7 @@ import org.springframework.data.neo4j.annotation.StartNode;
*/
@RelationshipEntity
public class Role {
+ @GraphId Long id;
@EndNode Movie movie;
@StartNode Person actor;
@@ -35,4 +37,21 @@ public class Role {
public String toString() {
return String.format("%s acts as %s in %s", actor, name, movie);
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Role role = (Role) o;
+ if (id == null) return super.equals(o);
+ return id.equals(role.id);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return id != null ? id.hashCode() : super.hashCode();
+ }
+
}
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/User.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/User.java
index 8d362207a..bb14020fb 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/User.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/User.java
@@ -2,10 +2,8 @@ package org.neo4j.cineasts.domain;
import org.neo4j.graphdb.Direction;
import org.neo4j.helpers.collection.IteratorUtil;
-import org.springframework.data.neo4j.annotation.Indexed;
-import org.springframework.data.neo4j.annotation.NodeEntity;
-import org.springframework.data.neo4j.annotation.RelatedTo;
-import org.springframework.data.neo4j.annotation.RelatedToVia;
+import org.springframework.data.neo4j.annotation.*;
+import org.springframework.data.neo4j.template.Neo4jOperations;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.core.GrantedAuthority;
@@ -14,6 +12,8 @@ import java.util.Set;
@NodeEntity
public class User {
+ @GraphId Long nodeId;
+
private static final String SALT = "cewuiqwzie";
public static final String FRIEND = "FRIEND";
public static final String RATED = "RATED";
@@ -38,22 +38,23 @@ public class User {
return new Md5PasswordEncoder().encodePassword(password, SALT);
}
- @RelatedToVia(elementClass = Rating.class, type = RATED)
- Iterable ratings;
+ @RelatedToVia(type = RATED)
+ @Fetch Iterable ratings;
- @RelatedTo(elementClass = Movie.class, type = RATED)
+ @RelatedTo(type = RATED)
Set favorites;
- @RelatedTo(elementClass = User.class, type = FRIEND, direction = Direction.BOTH)
- Set friends;
+ @RelatedTo(type = FRIEND, direction = Direction.BOTH)
+ @Fetch Set friends;
public void addFriend(User friend) {
this.friends.add(friend);
}
- public Rating rate(Movie movie, int stars, String comment) {
- return relateTo(movie, Rating.class, RATED).rate(stars, comment);
+ public Rating rate(Neo4jOperations template, Movie movie, int stars, String comment) {
+ final Rating rating = template.createRelationshipBetween(this, movie, Rating.class, RATED, false).rate(stars, comment);
+ return template.save(rating);
}
public Collection getRatings() {
@@ -114,4 +115,20 @@ public class User {
return name();
}
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ User user = (User) o;
+ if (nodeId == null) return super.equals(o);
+ return nodeId.equals(user.nodeId);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return nodeId != null ? nodeId.hashCode() : super.hashCode();
+ }
}
diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieDbImportService.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieDbImportService.java
index 6f8250c96..17b707d16 100644
--- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieDbImportService.java
+++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieDbImportService.java
@@ -1,12 +1,14 @@
package org.neo4j.cineasts.movieimport;
-import org.neo4j.cineasts.domain.*;
+import org.neo4j.cineasts.domain.Movie;
+import org.neo4j.cineasts.domain.Person;
+import org.neo4j.cineasts.domain.Roles;
import org.neo4j.cineasts.repository.MovieRepository;
import org.neo4j.cineasts.repository.PersonRepository;
-import org.neo4j.cineasts.service.CineastsRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.neo4j.template.Neo4jOperations;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -21,15 +23,16 @@ public class MovieDbImportService {
MovieDbJsonMapper movieDbJsonMapper = new MovieDbJsonMapper();
@Autowired
- MovieRepository movieRepository;
+ private MovieRepository movieRepository;
@Autowired
- PersonRepository personRepository;
+ private PersonRepository personRepository;
@Autowired
- MovieDbApiClient client;
+ private MovieDbApiClient client;
@Autowired
- MovieDbLocalStorage localStorage;
+ private MovieDbLocalStorage localStorage;
+ @Autowired private Neo4jOperations template;
@Transactional
public Map importMovies(Map ranges) {
@@ -68,7 +71,7 @@ public class MovieDbImportService {
Map data = loadMovieData(movieId);
if (data.containsKey("not_found")) throw new RuntimeException("Data for Movie "+movieId+" not found.");
movieDbJsonMapper.mapToMovie(data, movie);
- movie.persist();
+ movieRepository.save(movie);
relatePersonsToMovie(movie, data);
return movie;
}
@@ -84,7 +87,7 @@ public class MovieDbImportService {
}
private void relatePersonsToMovie(Movie movie, Map data) {
- Collection