如何将 neo4j Id 更改为 UUID 并使查找器方法起作用?
How can I change neo4j Id to UUID and get finder methods to work?
Neo4j 需要一个 Long 类型的 id 字段才能工作。这适用于 Spring data neo4j。我想要另一个 UUID 类型的字段,并让 T findOne(T id) 与我的 UUID 一起工作,而不是新生成的 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"
}
}
}
您可以向您的实体添加一个 String 属性,将其命名为 uuid,然后简单地声明一个 E findByUuid (String uuid) in your Repository for 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);
...
}
当涉及到存储库中的 finder 方法时,您可以自由地在自己的界面中覆盖 CrudRepository
中提供的方法,或者提供可能是 T findByUuid(Long uuid)
的替代方法。
根据您对 classes 建模的方式,您可以依赖方法名称的派生查询,或者您可以使用查询进行注释,例如:
@Query(value = "MATCH (n:YourNodeType{uuid:{0}) RETURN n")
如果您要使用特定的 UUID class,那么您需要告诉 Neo 如何保留 UUID 值。如果你将它存储为一个字符串(看起来很合理)那么我相信没有必要注释这个字段,那么你将需要一个 GraphProperty
注释:
@GraphProperty(propertyType = Long.class)
同样,根据 UUID 的 class,您可能需要使用 Spring 注册一个转换 class,它实现 org.springframework.core.convert.converter.Converter
接口并在您的域 class类型(UUID)和存储类型(String)。
或者,直接把UUID转成字符串自己存起来,不用担心所有的转换。
无论您做什么,请确保您的新 uuid
已编入索引并且可能是唯一的。
Neo4j 需要一个 Long 类型的 id 字段才能工作。这适用于 Spring data neo4j。我想要另一个 UUID 类型的字段,并让 T findOne(T id) 与我的 UUID 一起工作,而不是新生成的 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"
}
}
}
您可以向您的实体添加一个 String 属性,将其命名为 uuid,然后简单地声明一个 E findByUuid (String uuid) in your Repository for 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);
...
}
当涉及到存储库中的 finder 方法时,您可以自由地在自己的界面中覆盖 CrudRepository
中提供的方法,或者提供可能是 T findByUuid(Long uuid)
的替代方法。
根据您对 classes 建模的方式,您可以依赖方法名称的派生查询,或者您可以使用查询进行注释,例如:
@Query(value = "MATCH (n:YourNodeType{uuid:{0}) RETURN n")
如果您要使用特定的 UUID class,那么您需要告诉 Neo 如何保留 UUID 值。如果你将它存储为一个字符串(看起来很合理)那么我相信没有必要注释这个字段,那么你将需要一个 GraphProperty
注释:
@GraphProperty(propertyType = Long.class)
同样,根据 UUID 的 class,您可能需要使用 Spring 注册一个转换 class,它实现 org.springframework.core.convert.converter.Converter
接口并在您的域 class类型(UUID)和存储类型(String)。
或者,直接把UUID转成字符串自己存起来,不用担心所有的转换。
无论您做什么,请确保您的新 uuid
已编入索引并且可能是唯一的。