vendredi 13 mars 2015

Spring Data Neo4J template.fetch() not returning entire collection

I am completely baffled by this, and am not sure what else I can do to get this to work.


Using @Fetch on a relationship, will eagerly fetch that relationship.


Template.fetch can be used to fetch a relationship, if the property is not annotated with @fetch, i.e lazy loading. Does this type of lazy loading work with sets?


I have a node entity called Project, which has a set of scans. When I try to fetch the set of scans I only get 1 scan. When I modify the Project class to use @Fetch, I get 3 scans. The right amount of scans is 3. Using template.fetch is not giving me the entire collection. The question is why? Is there something wrong in my code?


The issue here is ProjectServiceImpl.findAllScans();


Below is my source code, starting with my maven pom file.



<!-- Spring Version -->
<properties>
<java-version>1.8</java-version>
<spring.version>4.0.9.RELEASE</spring.version>
<spring.security.version>3.2.5.RELEASE</spring.security.version>
<jackson.version>2.3.0</jackson.version>
<guava.version>15.0</guava.version>
<spring.neo4j.version>3.1.5.RELEASE</spring.neo4j.version>
<spring.mongodb.version>1.6.2.RELEASE</spring.mongodb.version>
<ehcache.version>2.9.0</ehcache.version>
<logback.version>1.1.2</logback.version>
<jcloverslf4j.version>1.7.10</jcloverslf4j.version>
<javax.servlet.version>3.1.0</javax.servlet.version>
<javax.validation.version>1.1.0.Final</javax.validation.version>
<spring.swagger.version>1.0.0</spring.swagger.version>
<spring.swagger.ui.version>0.4</spring.swagger.ui.version>
</properties>

<repositories>
<repository>
<id>jcenter-release</id>
<name>jcenter</name>
<url>http://ift.tt/1N3bRFX;
</repository>
<repository>
<id>oss-jfrog-artifactory</id>
<name>oss-jfrog-artifactory-releases</name>
<url>http://ift.tt/13atVvN;
</repository>
</repositories>

<dependencies>

<dependency>
<groupId>org.ajar</groupId>
<artifactId>swagger-spring-mvc-ui</artifactId>
<version>${spring.swagger.ui.version}</version>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>com.mangofactory</groupId>
<artifactId>swagger-springmvc</artifactId>
<version>${spring.swagger.version}</version>
</dependency>

<!-- Spring Framework Core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<!-- Jackson JSON Dependencies-->

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>

<!-- Servlet 3.1 and Java EE Validation API-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet.version}</version>
</dependency>

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${javax.validation.version}</version>
</dependency>

<!-- Spring Data MongoDB -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring.mongodb.version}</version>
</dependency>

<!-- Spring Data Neo4J -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>${spring.neo4j.version}</version>
</dependency>


<!-- Ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>

<!-- Google Guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>

<!-- Logback -->

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcloverslf4j.version}</version>
</dependency>

</dependencies>
<build>
<finalName>TEST</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>


The Project Pojo:



@NodeEntity
public class Project {

// Properties
@GraphId
private Long id;
@Indexed(unique = true)
private String name;
@Indexed
private String xxxxId;

// Relationships
@RelatedTo(type = "HAS_SCAN", elementClass = Scan.class)
private Set<Scan> scans;


The next code snippet below is the scan class I use.



@NodeEntity
public class Scan {

// Properties
@GraphId
private Long id;
@Indexed
private String xxxxId;
@Indexed
private String projectVersion;
@Indexed
private Date date;

//Relationships
@RelatedTo(type = "NEXT_SCAN")
private Scan scan;
@RelatedTo(type = "HAS_ISSUE", elementClass = Issue.class)
private Set<Issue> issues;
@RelatedTo(type = "HAS_DEPENDENCY", elementClass = Dependency.class)
private Set<Dependency> dependencies;
@RelatedTo(type = "HAS_PACKAGE", elementClass = Package.class)
private Set<Package> packages;


The next code snippet below is the repository class I use.



@Repository
public interface ProjectRepository extends GraphRepository<Project> {

@Query("MATCH (p:Project) RETURN p")
public Set<Project> findAllProjects();

@Query("MATCH (p:Project {xxxId:{0}}) RETURN p")
public Project findProjectById(String projectId);

}


The class below is snippet of the service class I use, where I am calling template.fetch



@Service
@Transactional
public class ProjectServiceImpl implements ProjectService {

@Autowired
private Neo4jTemplate template;
@Autowired
private ProjectRepository projectRepository;
@Autowired
private ScanRepository scanRepository;

private static final Logger LOGGER = LoggerFactory.getLogger(ProjectServiceImpl.class);

@Override
public ProjectsDTO findAllProjects() {
return DTOTransformerUtil.transformProjectSetToProjectsDTO(projectRepository.findAllProjects());
}

@Override
public ProjectDTO findProject(String projectId) {

if (projectId != null) {
return DTOTransformerUtil.transformProjectToProjectDTO(projectRepository.findProjectById(projectId));
}
return null;
}

@Override
public ScansDTO findAllScans(String projectId) {

if (projectId != null) {
Project project = projectRepository.findProjectById(projectId);
return DTOTransformerUtil.transformScanSetToScansDTO(template.fetch(project.getScans()));
}
return null;
}


I am completely lost as to what the issue maybe be, i am currently trying older version of Spring data neo4j, maybe that may help resolve the issue.


Aucun commentaire:

Enregistrer un commentaire