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

纵然是瞬间 提交于 2019-12-11 02:45:21

问题


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://oss.jfrog.org/artifactory/oss-release-local/</url>
        </repository>
        <repository>
            <id>oss-jfrog-artifactory</id>
            <name>oss-jfrog-artifactory-releases</name>
            <url>http://oss.jfrog.org/artifactory/oss-release-local</url>
        </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.

来源:https://stackoverflow.com/questions/29044335/spring-data-neo4j-template-fetch-not-returning-entire-collection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!