我正在将使用@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关系的每一方 - 结果相同。
答案 0 :(得分:0)
我发现了问题。它的深奥和合理性足以让其他人看到相同的症状。
首先,我没有表明我有自己的SourcePage的hashCode()。它散列了一个定义为:
的字段@NotEmpty
@Indexed
private String url;
没有@Fetch&#39; url&#39;不会自动检索,因此容器中的所有SourcePages都具有相同的哈希码。这导致了100%的冲突,并且只有一个条目被添加到集合中。
如果我删除了hashCode(),则默认哈希工作,所有对象都被添加到集合中。
经过几个小时的调试,我发布了我的问题。当然在那之后我偶然发现了解决方案。
故事的道德:不提供没有ID的成员数据的哈希函数。