使用RelationshipEntity时的循环依赖关系

时间:2016-04-20 12:51:34

标签: maven neo4j relationship spring-data-neo4j-4

比方说,我有UserProduct。 用户应该能够对产品进行评级,并且评级可以具有许多属性,例如从1到5的多个星。 我想在不同的Maven模块中使用ProductUser。 但是,Product应该知道它的所有者,因此存在对模块的依赖,持有User。 我还希望有一个评级模块,其中包含与评级相关的所有内容。

我构建了评级

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

RatingProperty包含代表1到5星评级的int。 现在我从Documentation了解到我需要将Rating作为某个节点内的属性,因为SDN4不接受它。 实际上,当我没有将它用作属性并尝试save时,我得到了标识null而不是元素出现在数据库中。 由于Rating需要知道UserProduct,因此当我尝试将Rating放入User类时,我会得到循环依赖关系。 当我将它放入Product类时也一样。

据我所知,当Start-和EndNode实体位于不同的Maven模块时,使用RelationshipEntity似乎是不可能的,因为关系需要知道两者并且其中一个节点需要知道这种关系。 这似乎不对,所以我觉得我理解的是非常错误。 我还尝试在评级模块中创建一个新的NodeEntity来保存Rating。这是

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

但是这样我得到了与我在某处不使用RelationshipEntity作为属性时所做的相同的行为。

你有没有办法更好地做到这一点?

2 个答案:

答案 0 :(得分:2)

RelationshipEntity表示图表中的边缘,您可以通过域对象设置和检索属性。但是,由于Neo4j不支持超边(边缘附加到其他边),因此这些属性必须是简单的Java属性,而不是域中的其他对象,如RatingProperty

首先尝试用简单的RatingProperty替换Integer,看看是否能解决您的问题。如果是这样,您可以使用Custom Converter在图表中的Integer属性评级和RatingProperty对象之间进行转换。

如果您的域对象位于不同的模块中,这不会导致任何问题:只需确保在SessionFactory构造函数的参数中枚举所有相关的包:

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

答案 1 :(得分:0)

在测试Vinces的建议时,我改变了创建关系的进度。 Unitl现在,我持有startnode,然后是endnode,然后尝试使用存储库extends GraphRepository<Rating>save RelationshipEntity。每当我这样做时,我都会得到一个ID null的评分。当我将评级作为属性添加到startnode而不是保存新关系时,保存了startnode,它起作用了。 我不确定,如果这是建议的方式,但我得到了我的关系,所以它适合我。