使用 RelationshipEntity 时的循环依赖

Cyclic Dependency when using RelationshipEntity

比方说,我有一个 User 和一个 Product。 用户应该能够对产品进行评分,并且评分可以具有很多属性,例如从 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 它时,我得到了 id null 而不是元素出现在数据库中。 由于 Rating 需要知道 UserProduct,当我尝试将 Rating 放入 User [=45= 时,我得到了循环依赖]. 当我将它放入 Product Class.

时也是如此

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

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

但是通过这种方式,我得到了与我在某处不使用 RelationshipEntity 作为属性时相同的行为。

你有更好的方法吗?

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

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

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

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

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