使用 RelationshipEntity 时的循环依赖
Cyclic Dependency when using RelationshipEntity
比方说,我有一个 User
和一个 Product
。
用户应该能够对产品进行评分,并且评分可以具有很多属性,例如从 1 到 5 的星数。
我想在不同的 Maven 模块中使用 Product
和 User
。
但是,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
需要知道 User
和 Product
,当我尝试将 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
的评分。当我将评级作为属性添加到起始节点而不是保存新关系时,保存了起始节点,它起作用了。
我不确定,如果这是建议的方式,但我有我的关系,所以它对我有用。
比方说,我有一个 User
和一个 Product
。
用户应该能够对产品进行评分,并且评分可以具有很多属性,例如从 1 到 5 的星数。
我想在不同的 Maven 模块中使用 Product
和 User
。
但是,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
需要知道 User
和 Product
,当我尝试将 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
的评分。当我将评级作为属性添加到起始节点而不是保存新关系时,保存了起始节点,它起作用了。
我不确定,如果这是建议的方式,但我有我的关系,所以它对我有用。