2015-12-15 86 views
4

我试图从Spring Data Neo4J 3升级到4 - 我使用的是Neo4J 2.2.2。Spring Data Neo4J 4 - no template.fetch()

我使用GraphRepository实例来查询数据库,取回对象。

该对象有几个关系,这些关系不会被提取(故意避免在整个图表中读取)。

在SDN3代码中,只需使用Neo4JTemplate类为我需要获取的每个关系执行获取调用。这工作非常好。

但是,在SDN4中,该工具已被删除,并由load()方法的各种实现取代。从文档中不清楚如何实现我在SDN3中所做的工作。

要清楚的是:如果我有一组对象在第一个类中检索,由关系控制,我只想检索该Set中的对象,而不是数据库中这些对象的整个集合。

我在升级过程中遗漏了一些至关重要的东西,还是有一种简单的方法来做我想做的事情?

添加代码:

我的实体类:

@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()方法,我得到一个空返回时,因为根据国家制定的是空的(尚未被提取)。

再次看我的代码,我不知道是否因为我没有使用从存储库“本机”加载方法,但重载的版本?

回答

0

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

加载一个深度为0的实体将获取实体的属性,并且没有相关的实体。 深度1将获取相关实体的第一层,但不涉及它们之间的关系等。

不支持通过关系类型来控制深度。

+0

感谢您的快速回复。我读过你链接到的文档,它包含这个句子“默认情况下,加载一个实例将映射该对象的简单属性及其与直接相关的对象(即depth = 1)。”这似乎并不是我的情况应用程序,其中由关系指定的对象的集合未被填充。我误解了这里的情况吗? – TrueDub

+0

这听起来不对。默认深度1应加载相关对象。你能用调试日志中的一些代码或测试以及任何感兴趣的线更新你的问题吗? – Luanne

+0

添加了代码 - 感谢所有帮助,谢谢。 – TrueDub