Spring Data Neo4j+Spring Data Rest:对所有CRUD操作使用自然密钥,而不是Neo4j节



我正在编写一个依赖于Spring Data Rest和Spring Data Neo4J的Spring Restful微服务。

我们不想在JSON响应的HAL链接中公开内部Neo4J节点标识符。原因是(据我所知)在节点删除的情况下,Neo4J会重用这些标识符。如果是这种情况,这将给我们带来数据完整性问题。因此,我们宁愿使用自然密钥,例如UUID如果我关于neo4J节点Id重用的假设是错误的,请纠正我

我们想要实现的是对所有CRUD操作使用自然密钥,而不是节点Id(即:PUThttp://localhost:8080/apiname/5448ae86-fe87-4daf-bf5-985522a1cf14与一些身体)。

我们的第一种方法是扩展NodeGraphRepositoryImp。例如

protected Node getById(UUID id) {
    Node node = (Node) this.findByPropertyValue("uuid_id", id);
    return template.getNode(node.getId());
}

并通过在Neo4J配置中注入自定义的Neo4jTemplate来实例化它。

然而,由于以下原因,这种方法不起作用:

1) 我不能定义任何其他idProperty,与NodeEntity类中用@GraphId注释的idProperty不同。因此,Spring Data Rest最终试图将自然密钥(例如UUID)分配给neo4j节点id字段(即Long),但在类型转换时失败。

2) Spring Data Neo4J似乎没有使用我们的自定义类来扩展NodeGraphRepositoryImpl,而是使用原始的未扩展的NodeGraphRepositoryImpl类。

也许这种方法是错误的。你能推荐一种实现它的方法吗?

非常感谢你的帮助。

Spring Data Rest引入了BackendIdConverter,用于覆盖/自定义URI中公开的字段。

请查看DATAREST-155(https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-155)

你能试试吗?

您还可以查看以下线程:

如何使用neo4j 在春季数据休息中自定义自己、父母和孩子的链接

最新更新