I'm writing writing a Spring Restful microservice that relies on Spring Data Rest and Spring Data Neo4J.
We don't want to expose the internal Neo4J node identifier in the HAL links of the JSON response. The reason being (as far as I understand) that these identifiers are reused by Neo4J in case of node deletion. If this is the case this will present us with data integrity problems. And so we'd rather use a natural key, for example, UUID. Please correct me if my assumption regarding the reuse of neo4J node Ids is wrong.
What we want to achieve is using a Natural Key for all CRUD operations instead of the node Id (ie: PUT http://localhost:8080/apiname/5448ae86-fe87-4daf-bfb5-985522a1cf14 with some body).
Our first approach was to extend NodeGraphRepositoryImp . E.g.
protected Node getById(UUID id) {
Node node = (Node) this.findByPropertyValue("uuid_id", id);
return template.getNode(node.getId());
}
And instantiate it by injecting a customized Neo4jTemplate in the Neo4J configuration.
However this approach doesn't work for the following reasons:
1) I cannot define any other idProperty different from the one annotated with @GraphId in the NodeEntity class. As a result Spring Data Rest ends up trying to assign the natural key (e.g. UUID) to the neo4j node id field (that is a Long) and fails on type conversion.
2) It seems that the Spring Data Neo4J is not using our custom class that extends NodeGraphRepositoryImpl but the original not extended NodeGraphRepositoryImpl class instead.
Maybe this approach is wrong. Could you please recommend a way to achieve it?
Thanks a lot for your help.