Spring Data Neo4j neo4jTemplate.fetch()只返回一个值

时间:2015-05-16 15:41:07

标签: neo4j spring-data-neo4j

我正在将使用@Fetch的工作系统转换为延迟加载策略。但是,当我使用容器检索对象时,容器只有一个条目,而neo4jTemplate.fetch(obj.getContainer())不会检索其他条目。

以下是相关的片段

@NodeEntity
public class SourcePage {

    @GraphId
    private Long id;

    @RelatedTo(type = "GROUP_MEMBER")
    private Group group;

小组课程:

@NodeEntity
public class Group {
    @GraphId
    private Long id;

    @RelatedTo(type = "GROUP_MEMBER", direction = Direction.INCOMING)
    private Set<SourcePage> sourcePages = new HashSet<>();

测试代码:

    Group group1 = groupRepository.findByName("Test Group");
    neo4jTemplate.fetch(group1.getSourcePages());
    assertThat(group1.getSourcePages().size(), is(254));

结果:

java.lang.AssertionError: 
Expected: is <254>
     but: was <1>

如果我除了将@Fetch添加到私人群组之外什么都不做,那么它都会按预期工作。

此外,我只使用此测试示例查看了数据库服务器并运行了此查询:

MATCH (a)-[:`GROUP_MEMBER`]->(b) RETURN count(b)

按预期返回254。我也尝试过direction.BOTH关系的每一方 - 结果相同。

1 个答案:

答案 0 :(得分:0)

我发现了问题。它的深奥和合理性足以让其他人看到相同的症状。

首先,我没有表明我有自己的SourcePage的hashCode()。它散列了一个定义为:

的字段
@NotEmpty
@Indexed
private String url;

没有@Fetch&#39; url&#39;不会自动检索,因此容器中的所有SourcePages都具有相同的哈希码。这导致了100%的冲突,并且只有一个条目被添加到集合中。

如果我删除了hashCode(),则默认哈希工作,所有对象都被添加到集合中。

经过几个小时的调试,我发布了我的问题。当然在那之后我偶然发现了解决方案。

故事的道德:不提供没有ID的成员数据的哈希函数。