SDN 5.0.2.RELEASE中@NodeEntity的@Id@GeneratedValue是否唯一且不被回收?
在SDN 5.0.2.RELEASE中使用@Id+@GeneratedValue的唯一性与回收问题
首先可以明确地说:在SDN 5.0.2.RELEASE版本中,用@Id搭配@GeneratedValue生成的实体ID是唯一且不会被回收复用的,完全避开了早期版本里Neo4j内部ID的坑。
具体原因得从SDN的ID生成机制说起:
首先,SDN 5.x默认的
@GeneratedValue策略和Neo4j的内部ID完全无关。它有两种默认生成逻辑,取决于你的ID字段类型:- 如果ID是
Long/long类型(就像你示例里的Movie类那样),SDN会使用IncrementalIdGenerator:它会在Neo4j库中创建一个专门的__NextId__节点来维护全局的ID计数器,每次创建新实体时,这个计数器会递增并分配新ID。就算你删除了某个实体,这个计数器也不会回退,所以生成的ID永远不会重复,更不会被回收复用。 - 如果ID是
String类型,默认会用UUIDStringGenerator生成UUID字符串,这种ID本身就是全局唯一的,自然不存在重复或被回收的问题。
- 如果ID是
至于你提到的早期版本不建议用Neo4j内部ID的问题,那是因为当时如果直接映射Neo4j的内部节点ID(也就是调用节点
id()方法返回的值)作为实体主键,确实会有被回收复用的风险——当你删除节点后,这个ID可能会被分配给新创建的节点。但在SDN 5.0.2里,只有当你显式指定@GeneratedValue(strategy = GenerationType.IDENTITY)时,才会映射到Neo4j的内部ID,而默认的@GeneratedValue是不会这么做的。
所以总结下来,只要你用的是默认的@Id @GeneratedValue配置(没有指定IDENTITY策略),就完全不用担心ID重复或者被回收的问题,可以放心使用。
内容的提问来源于stack exchange,提问作者Coder Shark
相关产品推荐
相关产品推荐

