2016-04-20 5 views
1

Sagen wir, ich habe eine User und eine Product. Der Benutzer sollte Produkte bewerten können und eine Bewertung kann viele Eigenschaften wie zum Beispiel eine Anzahl von Sternen von 1 bis 5 haben. Ich hätte gerne die Product und die User in verschiedenen Maven-Modulen. Allerdings sollte Product seinen Besitzer kennen, daher gibt es eine Abhängigkeit zu dem Modul, das User enthält. Ich würde auch gerne ein Rating-Modul haben, das alles im Zusammenhang mit Bewertungen enthält.Zyklische Abhängigkeit bei Verwendung von RelationshipEntity

konstruierte ich die Bewertung

@RelationshipEntity(type="RATES") 
public class Rating{ 
    private Long id; 
    @StartNode 
    private User rater; 
    @EndNode 
    private Product ratee; 
    @Property 
    private RatingProperty property; 
    //Getter/Setter 
} 

Wo die RatingProperty die int die 1 bis 5 Sterne darstellt, enthält. Nun verstehe ich von der Documentation, dass ich die Rating als ein Attribut in einem Knoten haben muss, weil SDN4 es nicht akzeptiert. In der Tat, wenn ich es nicht als Attribut verwendet und versucht save es, ich habe die ID null und nicht Element in der DB erschienen. Da die Rating beide User und Product wissen muss, bekomme ich eine zyklische Abhängigkeit, wenn ich versuche, die Rating in die User Klasse zu setzen. Das gleiche, wenn ich es in die Klasse lege.

Soweit ich im Moment zu verstehen, unter Verwendung eines RelationshipEntity scheint nicht möglich sein, wenn die Start- und EndNode Einheiten in verschiedener Maven-Module sind, weil die Beziehung beide wissen muss, und einer des Knoten muss das wissen, Beziehung. Das scheint nicht richtig, also denke ich, dass ich etwas sehr falsch verstehe. Ich habe auch versucht, eine neue NodeEntity im Rating-Modul zu erstellen, nur um die Rating zu halten. Dies war

@NodeEntity 
public class RatingWrapper{ 
    private Long id; 
    @Relationship(type="RATES) 
    private Rating rating; 
    //Getter/Setter 
} 

aber auf diese Weise bekam ich das gleiche Verhalten, das ich habe, wenn ich nicht die RelationshipEntity als Attribut irgendwo benutzt haben.

Sehen Sie einen Weg, dies besser zu tun?

Antwort

0

Bei der Prüfung von Vinces Beratung , Habe ich den Fortschritt beim Erstellen der Beziehung geändert. Nun habe ich den Startknoten, dann den Endknoten beibehalten und dann versucht, ein Repository extends GraphRepository<Rating> zu save der RelationshipEntity zu verwenden.Immer wenn ich das tat, bekam ich eine Bewertung mit der ID null. Als ich die Bewertung als Attribut zum Startknoten hinzufügte und die neue Beziehung nicht speicherte, den Startknoten speicherte, funktionierte es. Ich bin mir nicht sicher, ob dies der vorgeschlagene Weg ist, aber ich habe meine Beziehung, also funktioniert es für mich.

2

Ein RelationshipEntity stellt eine Kante mit dem Diagramm dar, auf der Sie Eigenschaften über Ihre Domänenobjekte festlegen und abrufen können. Da Neo4j jedoch keine Hyperkanten unterstützt (Kanten, die anderen Kanten zugeordnet sind), müssen diese Eigenschaften einfache Java-Eigenschaften sein, keine anderen Objekte in Ihrer Domäne wie RatingProperty.

Ersetzen Sie zuerst RatingProperty durch eine einfache Integer und sehen, ob das Ihr Problem löst. Wenn dies der Fall ist, können Sie eine Custom Converter verwenden, um zwischen der Integer-Eigenschaft im Diagramm und Ihrem RatingProperty-Objekt zu konvertieren.

Wenn Ihre Domain-Objekte in verschiedenen Modulen sind, soll dies keine Probleme verursachen: nur, dass aufgezählt in dem Argumente der Session Konstruktor wird alle relevanten Pakete gewährleisten:

new SessionFactory("app.module1.domain", "app.module2.domain", ...)

+0

Das hat mein Problem nicht gelöst, da meine 'RatingProperty' momentan nur ein Enum ist, aber das hätte wahrscheinlich zu zukünftigen Problemen geführt, danke. – Urr4

Verwandte Themen