Spring Data Neo4J 4 - 没有template.fetch()方法

4
我正在尝试将Spring Data Neo4J 3升级到4-我正在使用Neo4J 2.2.2。
我使用GraphRepository实例查询数据库,获取对象。
该对象具有多个关系,这些关系不会被获取(故意避免读取整个图形)。
在SDN3代码中,只需使用Neo4JTemplate类执行每个需要获取的关系的提取调用。这非常有效。
然而,在SDN4中,此功能已被删除,并由load()方法的各种实现替换。从文档中不清楚如何实现我在SDN3中所做的事情。
明确一点:如果我在第一个检索的类别中有一组对象,由一个关系管理,我想只检索该集合中的对象,而不是数据库中所有这些对象的整个集合。
我是否在升级过程中错过了关键内容,还是有一种简单的方法可以做我所要做的事情?
添加代码:
我的实体类:
@NodeEntity
public class File implements MetroNode {

    private Long id;

    private String fileName;

    private SourceState sourceState;

    private Set<State> states;

    @GraphId
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    @Relationship(type = "HAS_FILE", direction = Relationship.INCOMING)
    public SourceState getSourceState() {
        return sourceState;
    }

    public void setSourceState(SourceState sourceState) {
        this.sourceState = sourceState;
    }

    public State addState(MetroNode otherNode, StateStatus status) {
        if (this.states == null) {
            this.states = new HashSet<State>();
        }
        State state = new State(this, otherNode, status.toString());
        this.states.add(state);
        return state;
    }

    @Relationship(type = "HAS_STATE", direction = Relationship.OUTGOING)
    public Set<State> getStates() {
        return states;
    }

    public State getActiveState() {
        if (this.states != null) {
            for (State state : this.states) {
                if (state.isActive()) {
                    return state;
                }
            }
        }
        return null;
    }

}

我的仓库类:

public interface FileRepository extends GraphRepository<File> {

    File findByFileName(String fileName);     
}

执行 getActiveState() 方法时,返回 null,因为状态集合为空(尚未获取)。

重新查看我的代码,我想知道是否由于我没有使用来自存储库的“本机”加载方法,而是使用了重载版本?

1个回答

0

SDN 4 允许您使用 persistence horizon 控制相关实体的加载。

深度为 0 的实体加载将获取实体的属性,但不会获取任何相关实体。 深度为 1 将获取第一层相关实体,但不包括它们的关系,以此类推。

不支持按关系类型控制深度。


感谢您的快速回复。我已经阅读了您提供的文档,并发现其中包含这样一句话:“默认情况下,加载实例将映射该对象的简单属性及其直接相关的对象(即深度=1)。” 但在我的应用程序中似乎并非如此,在关系指定的对象集合中未填充数据。我是否误解了这种情况? - TrueDub
你还需要确保任何传入的关联都已经被标注了方法(如果存在,则是字段)- 因此你需要在 setSourceState 上添加 @Relationship(type = "HAS_FILE", direction = Relationship.INCOMING)。 - Luanne
我会尽快尝试使用4.1.0.BUILD-SNAPHOT。你确定那个注解是正确的吗?它需要在同一个类的setter和getter上吗?另外,我尝试通过执行“File newFile = template.load(File.class,file.getId(),-1)”来加载文件,作为一次实验,但它仍然返回相关对象的null值。 - TrueDub
构建针对该快照和仓库失败 - 找不到neo4j-ogm-1.1.4-SNAPSHOT.jar,在您指定的仓库中不存在。 - TrueDub
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/98049/discussion-between-luanne-and-truedub。 - Luanne
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接