比方说,我有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
时,我得到了标识null
而不是元素出现在数据库中。
由于Rating
需要知道User
和Product
,因此当我尝试将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
作为属性时所做的相同的行为。
你有没有办法更好地做到这一点?
答案 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,它起作用了。
我不确定,如果这是建议的方式,但我得到了我的关系,所以它适合我。