如何将neo4j Id更改为UUID并使finder方法工作?

时间:2015-01-20 15:27:15

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

Neo4j需要一个id字段才能工作,类型为Long。这适用于Spring数据neo4j。我想有另一个类型为UUID的字段,并且使用T findOne(T id)来处理我的UUID而不是neo生成的ID。

当我使用Spring Data Rest时,我不想在URL中公开neo的id。

http://localhost:8080/resource/ {neoId}

http://localhost:8080/resource/ {UUID}

如果有可能,有什么想法吗?

已更新

{
    name: "Root",
    resourceId: "00671e1a-4053-4a68-9c59-f870915e3257",
    _links: {
    self: {
        href: "http://localhost:8080/resource/9750"
    },
    parents: {
         href: "http://localhost:8080/resource/9750/parents"
    },
    children: {
        href: "http://localhost:8080/resource/9750/children"
              }
     }
 }

2 个答案:

答案 0 :(得分:2)

当涉及到存储库中的finder方法时,您可以自行覆盖您自己界面中CrudRepository中提供的方法,或者提供可能为T findByUuid(Long uuid)的替代方法。

根据您对类的建模方式,您可以依赖方法名称中的派生查询,也可以使用查询进行注释,例如:

@Query(value = "MATCH (n:YourNodeType{uuid:{0}) RETURN n")

如果您要使用特定的UUID类,那么您需要告诉Neo如何保留UUID值。如果你将它存储为一个字符串(似乎合理),那么我相信没有必要注释该字段,其他任何东西你需要GraphProperty注释:

@GraphProperty(propertyType = Long.class)

再次根据UUID的类,您可能需要使用Spring注册转换类,该类实现org.springframework.core.convert.converter.Converter接口并在您的域类类型(UUID)和存储类型(String)之间进行转换。

或者,只需将UUID转换为字符串并自行存储,不用担心所有转换。

无论您做什么,请确保您的新uuid已被编入索引并且可能是唯一的。

答案 1 :(得分:0)

您可以向实体添加 String 属性,将其命名为 uuid ,然后在您的实体中声明 E findByUuid(String uuid) E 存储库,Spring Data将自动为其生成代码。 例如:

@NodeEntity
public class Entity {
    ...
    @Indexed
    private String uuid;
    ...
    public String getUuid() {
        return uuid;
    }
    void setUuid(String uuid) {
        this.uuid = uuid;
    }
    ...
}

public interface EntityRepository extends GraphRepository<Entity> {
    ...
    Entity findByUuid(String uuid);
    ...
}