2012-05-26 11 views
6

Mit spring-data-neo4j möchte ich zwei Klassen mit @RelationshipEntity(type="OWNS") erstellen, um eine Person-Klasse mit einer Pet und Car zu verknüpfen.Mehrere Beziehungsklassen mit demselben Typ

@RelationshipEntity(type="OWNS") 
public class OwnsCar { 
    @Indexed 
    private String name; 

    @StartNode 
    private Person person; 

    @EndNode 
    private Car car; 
} 

@RelationshipEntity(type="OWNS") 
public class OwnsPet { 
    @Indexed 
    private String name; 

    @EndNode 
    private Person person; 

    @StartNode 
    private Pet pet; 
} 

Das spart an der Graph-Datenbank richtig ohne Probleme, da ich die tatsächliche Node und Relationship abfragen können und sehen sie Typ usw.

Aber wenn ich versuche, @RelatedTo(type="OWNS", elementClass=Pet.class) ich verwenden entweder bekommen Eine Klassenübergabeausnahme oder bei Verwendung der Lazy-Initialisierung erhalte ich falsche Ergebnisse.

@NodeEntity 
public class Person { 
    @Indexed 
    private String name; 

    @RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Pet.class) 
    private Set<Pet> pets; 

    @RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Car.class) 
    private Set<Car> cars; 
} 

Das Ergebnis, das ich erhalte, wenn ich versuche, unsere meine Person zu drucken (mein toString() weggelassen worden, aber es ruft einfach die toString() für jedes Feld), ist dies:

Person [nodeId=1, name=Nick, pets=[Car [nodeId=3, name=Thunderbird]], cars=[Car [nodeId=3, name=Thunderbird]]] 

Wer weiß, wenn Dies kann getan werden, sollte getan werden, ist nur ein Fehler oder eine Funktion, die fehlt?

Antwort

3

Es scheint, als ob das Problem ist, dass die Annotation bewirkt, dass springDataNeo4j den Beziehungsnamen priorisiert. Ich habe das gleiche bei einem anderen Sample versucht, das ich erstellt habe. Wenn beide Annotationen type="OWNS" enthalten, werden beide "Objekte" gemischt. Wenn ich diese Informationen weglasse und nur Richtung und Typ verwende, funktioniert es für mich.

Leider wird dies zu einem Problem führen, wenn Sie eine weitere @RelatedTo-Annotation mit mehr Pets oder Cars verwenden, die mit einer anderen Annotation verbunden sind. Da es sich zwischen "OWNS" und einer anderen Beziehung zu einem Haustier-Typ nicht unterscheidet, gibt das Set alle verwandten Haustiere zurück (Beispiel: Peter -> (HATES-Relationship) -> Hunde).

Wenn es ein Fehler ist oder nicht, kann ich nicht sagen ... Aber für die Datenbank: Es gibt nur Knoten und Beziehungen. Beide sind nicht getippt, so dass neo4j nichts über deine 'Pet'- oder' Car'-Klasse weiß. Spring-Daten neo4j übernimmt dies, indem entweder alle Knoten nach Typ indiziert werden und ein Type-Attribut gesetzt wird, oder ein bestimmtes Graph-Layout (mit Subreferenzen) verwendet wird. Selbst wenn Sie alle Haustiere einer Person mit einer Traversalbeschreibung abrufen möchten, müssten Sie viel mehr Code schreiben, da die ausgehenden Beziehungen mit dem Namen 'OWNS' zwei Arten von Objekten enthalten.

Ich würde empfehlen, zwei verschiedene Namen zu verwenden. Es ist einfacher, später Ihre benutzerdefinierten Traversals/Abfragen zu schreiben, und das ist wahrscheinlich sogar noch schneller, da kein Klassenvergleich erforderlich ist. Gibt es einen Grund, warum Sie diese spezifischen Namen benötigen?

PS: Es ist möglich, dass nicht alles 100% genau ist. Ich kenne springdataneo4j nicht im Detail, aber das habe ich bisher herausgefunden.

Verwandte Themen