为什么@RelatedToVia具有可选的type和elementClass参数?

时间:2014-09-10 17:35:54

标签: java spring neo4j spring-data spring-data-neo4j

Spring-Data-Neo4j中的

@RelatedToVia注释NodeEntity对象上的字段,作为对将该节点连接到另一个节点的@RelationshipEntity对象的引用。相反,@RelatedTo将该字段标记为对连接节点本身的引用,并且具有可选的type参数,该参数可用于指定两个节点之间的关系类型。

@RelationshipEntity(type="SOME_LINK")
class SomeLink { 
    @StartNode 
    FooNode foo;

    @EndNode 
    BarNode bar;
}

@NodeEntity
class FooNode {
    @RelatedTo(type="SOME_LINK")
    BarNode bar;

    @RelatedToVia(type="SOME_LINK") //what's the point in this annotation? 
    SomeLink link; 
}

@RelatedToVia具有相同的可选type参数,我很好奇为什么:关系类型在字段类型中指定(带@RelatedToVia注释的字段必须被输入到@RelationshipEntity - 带注释的类,它必须指定要编译的类型),那么在注释参数中指定它的重点是什么?

更令人困惑的是,@RelatedToVia还有一个可选的elementClass参数,根据文档,“返回目标关系实体类” - 完全指定的内容在字段类型中。

@RelatedToVia(elementClass=SomeLink.class)  //what's the point? 
SomeLink link; 

@RelatedToVia(elementClass=SomeOtherLink.class)  // ???? 
SomeLink link; 

我很好奇,因为我有一种预感,这是为了在RelationshipEntity类和RelatedToVia字段中实现一些有用的多态行为,我很想看到这样一种行为的例子可能会实施。作为奖励,使用两种不同的注释可以实现不同的种行为?

此外,似乎很奇怪这些参数都存在(可能是冗余的)指定关系的类型,而没有参数用于指定关系另一端的节点的类 - 这可以但不一定在RelationshipEntity课程中声明,并且在某些情况下对我有用。为什么会这样?

1 个答案:

答案 0 :(得分:0)

此:

@RelatedToVia(type="SOME_LINK")

优先于

@RelationshipEntity(type="SOME_LINK")

@RelatedToVia(elementClass=SomeOtherLink.class)  // this is indeed redundant
SomeLink link;

// this is NOT redundant, you lose the type information in runtime in Java
// you only know that link is a set, don't know of which type
@RelatedToVia(elementClass=SomeOtherLink.class)      
Set<SomeLink> link;

有多种方式来设置关系可以提供灵活性。您可以为具有相同属性的多个不同关系类型重用相同的关系类。

在参考文档中查看更多内容

http://docs.spring.io/spring-data/data-neo4j/docs/3.1.4.RELEASE/reference/html/programming-model.html#reference_programming_model_relationships_relationshiptypeprecedence