Spring数据neo4j存储库不能区分类型吗?

时间:2014-11-16 12:12:36

标签: neo4j spring-data-neo4j

这是一个惊喜。 Spring-Data-Neo4j GraphRepository代码似乎无法区分不同类型的对象。

如果我在存储库中查询一个id是一个不同类型的对象,我原本期望它不存在,而不是被加载 - 但是我的测试显示存储库似乎没有资格使用对象类型调用存在 / findOne ,因此错误地加载 B 实例,就好像它是 A一样

这是一个错误还是一个功能?

@NodeEntity class A { @GraphId Long id }
interface ARepository extends GraphRepository<A> {}

@NodeEntity class B { @GraphId Long id }
interface BRepository extends GraphRepository<B> {}

def "objects of different types should not leak between repositories"() {
    given: "an A and B object in the neo4j database"
    def a = new A()
    def b = new B()
    aRepository.save(a)
    bRepository.save(b)

    assert a.id != b.id

    when: "the A repository is queried for a B-id"
    def exists = aRepository.exists(b.id)
    def result = aRepository.findOne(b.id)

    then: "it should not be exist, and should not be loaded"
    !exists   // This assertion fails
    !result   // This assertion also fails
}

看起来像删除同样可以删除不同类型的对象。我原以为所有CRUD方法都会被与存储库正在工作的域对象关联的标签限定。

1 个答案:

答案 0 :(得分:0)

SDN中有一个用于控制该行为的类型安全策略/策略:

<bean id="typeSafetyPolicy" class="org.springframework.data.neo4j.support.typesafety.TypeSafetyPolicy">
    <constructor-arg type="org.springframework.data.neo4j.support.typesafety.TypeSafetyOption"><value>RETURNS_NULL</value></constructor-arg>
</bean>

@Bean TypeSafetyPolicy typeSafetyPolicy() { 
  return new TypeSafetyPolicy(TypeSafetyOption.RETURNS_NULL); 
}