Spring Data Neo4j 4 - @Fetch 更改为 findAll(int depth) 始终返回 null

标签 spring neo4j fetch spring-data-neo4j-4 neo4j-ogm

我有3个类,分别是User、Role和UserRole。我想获取UserRole的数据,但总是返回NULL。

这是用户类。

@NodeEntity
public class User {
    @GraphId
    Long id;

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    private String role;

    @NotNull
    private Boolean active;

    @Relationship(type = "HAS_ROLE", direction = Relationship.OUTGOING)
    private Set<UserRole> userRoles;

    public User() {
        super();
    }

    public Long getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public Iterable<UserRole> getUserRoles() {
        return userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }
}

这是我的角色类

@NodeEntity
public class Role {
    @GraphId
    Long id;

    @NotNull
    String name;

    @Relationship(type = "HAS_ROLE",direction = Relationship.OUTGOING)
    @JsonIgnore
    private Set<UserRole> userRoles;

    public Long getId() {
        return id;
    }

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


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<UserRole> getUserRoles() {
        return userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

    public Role() {
        super();
    }
}

这是我的 UserRole 类

@RelationshipEntity(type = "HAS_ROLE")
public class UserRole {
    @GraphId
    Long id;

    @StartNode
    @Relationship(type="HAS_ROLE", direction=Relationship.INCOMING)
    User user;

    @EndNode
    @Relationship(type="HAS_ROLE", direction=Relationship.INCOMING)
    Role role;

    public Long getId() {
        return id;
    }

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

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public UserRole(User user, Role role) {
        super();
        this.user = user;
        this.role = role;
    }

    public UserRole() {
        super();
    }
}

我想显示所有用户数据,但结果总是显示 userRoles NULL。我正在使用 findAll(1) 和 findAll(2) 但没有什么不同。

与SDN 3不同,我们只在字段中添加@Fetch。在SDN 4中,没有@Fetch注释。我如何获取所有数据?

更新!!

我像 Luanne 答案一样更改了类,并修改了 User 类,如下所示:

@NodeEntity
public class User {
    @GraphId
    Long id;

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    private String role;

    @NotNull
    private Boolean active;

    @Relationship(type = "HAS_ROLE")
    private Set<UserRole> userRoles;

    public Long getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    @Relationship(type = "HAS_ROLE")
    public Set<UserRole> getUserRoles() {
        return userRoles;
    }

    @Relationship(type = "HAS_ROLE")
    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

    public User(){
        super();
    }
}

保存数据并显示后,角色显示如下:

[{"id":27,"username":"daviduck123","password":"admin","firstName":"David","lastName":"Vincent","role":"admin","active":null,"roles":{"id":"29","name":"ROLE_ADMIN"}}]

但之后我尝试再次显示所有数据,并且它再次返回 NULL,如下所示:

[{"id":27,"username":"daviduck123","password":"admin","firstName":"David","lastName":"Vincent","role":"admin","active":null,"roles":null}]

这是我的存储库 https://github.com/daviduck123/neo4j-ogm-infiniteloop

最佳答案

@RelationshipEntity表示两个节点之间的限定关系,因此在其中使用@Relationship是不正确的。

UserRole 应该看起来像

@RelationshipEntity(type = "HAS_ROLE")
public class UserRole {
    @GraphId
    Long id;

    @StartNode
    User user;

    @EndNode
    Role role;

Role 类中的关系方向应为 INCOMING,因为您正在定义从 UserHAS_ROLE 关系角色:

    @Relationship(type = "HAS_ROLE",direction = Relationship.INCOMING)
    @JsonIgnore
    private Set<UserRole> userRoles;

   @Relationship(type = "HAS_ROLE",direction = Relationship.INCOMING)    
   public Set<UserRole> getUserRoles() {
        return userRoles;
    }

   @Relationship(type = "HAS_ROLE",direction = Relationship.INCOMING)   
   public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

确保访问器和修改器方法也被注释(当您具有 INCOMING 关系时,这是强制性的)。

关于Spring Data Neo4j 4 - @Fetch 更改为 findAll(int depth) 始终返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34646295/

相关文章:

java - 如何在 Spring Boot 中以 JSON 形式抛出异常

java - 一个模拟类工作正常,另一个返回 null

mysql - Neo4j 索引方法

使用 Csrf 的 Spring Security 单元测试导致找不到 HttpServletResponse

java - 如何返回 N1ql 查询结果作为 Couchbase 数据库的 REST API 的响应?

java - 非托管扩展的 Neo.ClientError.Security.AuthorizationFailed

neo4j - 如何在 Neo4j 中实现嵌套树?

javascript - React - 删除请求后组件不会重新渲染

javascript - 使用 Javascript 处理 XML 响应

javascript - 取消获取流