2016-03-19 9 views
2

Ich habe ein Modell, wo Benutzer eine Liste von Rollen und Rolle hat eine Liste von Berechtigungen. Aber selbst wenn ich alle gleichzeitig speichere - mit der Tiefe -1 kann ich die untergeordneten Knoten nicht von den übergeordneten Knoten abrufen. ex: user.getRoles() - 2 [role1, role2] role1.getAssociatedFeature() - 0 Aber wenn ich die Rolle aus der DB Ex erhalten: findByRoleName ('role1') -> [Rolle: role1, Display Rolle, associatedFeatures [2]]So speichern und abrufen verschachtelte Objekte in Neo4j mit Federdaten

User.java

@NodeEntity 
public class User { 

@GraphId Long id; 
private String name; 
private String loginUserName; 

@Relationship(type="ROLE") 
private Set<Role> associatedRoles = new HashSet<Role>(); 

} Role.java

@NodeEntity 
public class Role { 

    @GraphId Long id; 
    private String roleName; 
    private String displayRoleName; 
    @Relationship(type="ACCESS_TO") 
    private Set<Feature> associatedFeatures = new HashSet<Feature>(); 
} 
Feature.java 
@NodeEntity 
public class Feature { 
    @GraphId Long id; 
    private String featureName; 
    @Relationship(type="HAS_PERMISSION") 
    private Set<Permission> permissions = new HashSet<Permission>(); 
} 
@NodeEntity 
public @Data class Permission { 
    @GraphId 
    Long id; 
    String permission; 
} 

I Frühling Daten JPA ist mit den CRUD-Operationen zu verwenden: <> Repository.java - Dies wird bydefault implementieren speichern, zu aktualisieren, löschen, finden

@RepositoryRestResource() 
public interface RoleRepository extends GraphRepository<Role>{...} 

ServiceImpl.java 
    @Override 
     public User create(User u) { 
      return userRepo.save(u,-1); 
     } 

In meinem Junit- Ich erstelle eine neue User-Einheit, und bevölkern die Daten den ganzen Weg nach Erlaubnis. Aber wenn ich den Benutzer abhole -> ich bekomme nur die Rollen, aber nicht die Features, Erlaubnis entlang der Kette.

In der Neo4j DB-Browser sehe ich, dass alle Knoten mit entsprechenden Abhängigkeit erstellt werden. Irgendwelche Hinweise zum Speichern und Durchlaufen der Grafik?

Antwort

2

Die Standardladetiefe ist 1. Dies bedeutet, dass Sie den Benutzer und die zugehörigen Rollen, aber nicht die Funktionen der Rolle oder etwas tiefer im Diagramm erhalten.

Sie können die Ladetiefe angeben, wenn der Standard nicht das, was Sie wollen:

userRepo.findOne(user.getId(), 3);

http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#_fine_grained_control_via_depth_specification

+1

Dank Vince !! Das hat funktioniert. Ich habe mit Tiefe "-1" gespeichert, d. H. Alles gespeichert - aber während des Abrufens verwendete ich einen benutzerdefinierten Suchvorgang (findByName) und nicht den in GraphRepository definierten, der die Standardladetiefe zum Abrufen verwendete. Ich habe nicht genug Punkte, um eine Antwort zu verbessern, so ein verbaler Dank für jetzt :) –

+0

Kein Problem. Nur zur Erinnerung, es ist nicht notwendig, bei der Speichertiefe -1 anzugeben - es ist die Standardtiefe für das Speichern: alles, was von dem Objekt der obersten Ebene, das Sie beibehalten, erreichbar ist. – Vince

Verwandte Themen