这是一个惊喜。 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方法都会被与存储库正在工作的域对象关联的标签限定。
答案 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);
}