Spring 数据 Neo4j neo4jTemplate.fetch() 只有 returns 一个值

Spring Data Neo4j neo4jTemplate.fetch() only returns one value

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

这是相关的片段

@NodeEntity
public class SourcePage {

    @GraphId
    private Long id;

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

组Class:

@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 - 结果相同。

我发现了问题。它深奥而合理,可能会帮助其他人看到相同的症状。

首先,我没有显示我有自己的 SourcePage 的 hashCode()。它散列定义为的字段:

@NotEmpty
@Indexed
private String url;

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

如果我删除了 hashCode(),那么默认的哈希就会起作用,所有对象都会添加到集合中。

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

故事的寓意:不要在没有 ID 的情况下对成员数据提供哈希函数。