【问题标题】:Spring Data Neo4j + Spring Data Rest: Using a Natural Key for all CRUD operations instead of the Neo4J node IdSpring Data Neo4j + Spring Data Rest:对所有 CRUD 操作使用自然键而不是 Neo4J 节点 ID
【发布时间】:2015-04-18 09:56:22
【问题描述】:

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

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

我们想要实现的是对所有 CRUD 操作使用自然键而不是节点 ID(即:PUT http://localhost:8080/apiname/5448ae86-fe87-4daf-bfb5-985522a1cf14 和一些正文)。

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

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

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

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

1) 我不能定义任何其他 idPropertyNodeEntity 类中用 @GraphId 注释的不同。结果,Spring Data Rest 最终尝试将自然键(例如 UUID)分配给 neo4j 节点 id 字段(即 Long)并且类型转换失败。

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

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

非常感谢您的帮助。

【问题讨论】:

    标签: spring-data-neo4j spring-data-rest


    【解决方案1】:

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

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

    你可以试一试吗?

    你也可以看看下面的帖子:

    How can you customise self, parent, children links in spring data rest with neo4j

    【讨论】:

    • 嗨@theeagermichael,非常感谢您的回复。我看不到 BackendIdConverter SPI 接口如何帮助我,因为它自定义 如何 实体 ID 的公开方式,但它不允许自定义 what i> 字段在 rest 接口中作为实体 id 公开(如果您使用 Spring Data Neo4j 库,当前它使用 Neo4j 内部 id(@GraphId 字段)。实际上,BackendIdConverter 方法只接收id属性值和id的实体类型信息。有什么想法吗?再次感谢
    • 嗯,我明白了。您可以在 toRequestId 中执行类似 return neo4jTemplate.getNode((Long) id).getProperty("uuid").toString(); 的操作,但这会增加对节点的其他不必要的额外查找,以获取其他属性。
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多